2012-05-20 211 views
0

如何合并两个VCL组件,以便我可以访问它们的两个属性?如何将两个现有组件合并在一起?

例如,我想合并一个TImageTPanel成一个,我需要的是TPanel基础组件,所以TImage将孩子送到TPanel

可以做到这一点吗?

我一直试图通过组件>新建VCL组件在Delphi 2010中执行此操作,但是当我需要一个可视组件时它会创建非可视组件。

我该怎么做才能改变这种情况?

+1

好吧,那是因为您需要先编写代码,如果一切正常,那么您需要在IDE内注册该组件。为了访问这两个属性,您需要为这两个组件定义“代理”属性,即setter和getters – ComputerSaysNo

+1

您是否试图使用从TComponent派生的类来执行此操作?因为这就是为什么它是“非可视的”。 TComponent是非可视组件的基类。 –

回答

5

如果我理解正确,我认为你想合并两个组件并公开两个属性?

如果这是你在找什么,我要求加入一个的TImage和TScrollBox一起类似的问题可以在这里找到:

Component Creation - Joining Components Together?

SetSubComponent的关键是实现这一目标,它可能在阅读以上链接的评论和答案以了解更多信息时,请务必阅读。

3

Delphi语言不支持多重继承的实现,只有多重继承的接口。因此,你不能以你希望的方式简单地合并两个类。

无论如何,你提出的建议听起来有点奇怪。 TPanelTImage都有自己的视觉表面。我能想象的唯一可能的事情是,你可以让TImage成为TPanel的孩子。从TPanel衍生出一个新组件。该组件将创建并拥有TImage。使TImage子控件的父级成为面板。您想要在控件中显示的TImage控件的任何属性和事件都必须手动完成。这是构图而不是继承。

+1

换句话说,您可以从TPanel继承,并且TPanel可以包含TImage。但那不是“合并”,而是“合并”。复合控件不是非常困难。包含TImage的TPanel作为设计时间包安装后,它可以作为单个项目放入您的表单中。但是这有多有用?不是特别的。 –

+0

我可以理解你为什么说它不是非常有用,但我想要做的是减少编码。我添加了依赖于'OnMouseEnter'的视觉特性。如果用户将鼠标悬停在'TPanel'上,它的斜角将会改变,但是如果鼠标光标移动到'TImage'(这是'TPanel'的子元件),斜角就会被移除。这意味着我必须为“视觉特征”工作添加“TPanel”和“TImage”的代码。 – ple103

+1

@petersmileyface:这表明你只需要一个特定的TImage后裔,不会因为没有“充电鼠标”而与面板的边界“混淆”。将鼠标操作的图像设置为透明,并将所有操作都由面板处理(如果图像位于其中)。虽然不知道如何实现这一点,但我确信Warren,LU RD或其他VCL高手之一能够在这方面为您提供帮助。 –

1

您可以使用TFrame在设计时创建一个存在其他可视组件的组件,例如,一个TPanel上面有一个TImage。这可能不是你想要的:属性不是'合并'在一起的,你必须设计你自己的属性和方法来使这个新创建的组件按你的意愿行事。您需要的功能(根据鼠标的位置更改视觉功能)需要在框架中只构建一次。

相关问题