我是组件创建的新手,正在尝试使用Delphi的标准问题VCL创建一些自己的自定义派生组件。
我以为我可以将两个组件混合在一起,创建一个单独的组件。从目前为止,我的想法是将TImage放在TScrollBox中:
unit MyComponent;
interface
uses
Windows,
Classes,
Controls,
Forms,
ExtCtrls;
type
TMyPanel = class(TScrollBox)
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Standard', [TMyPanel]);
end;
{ TMyPanel }
constructor TMyPanel.Create(AOwner: TComponent);
var
AImage: TImage;
begin
inherited Create(AOwner);
AImage := TImage.Create(AOwner);
AImage.Align := alClient;
AImage.Parent := Self;
end;
destructor TMyPanel.Destroy;
begin
inherited;
end;
end.
如果我将上述内容编译并安装到包中,结果如下所示:
问题
我希望将我的组件注册为一个组件。但该组件应该是TScrollBox和TImage的组合。主要组件将是TScrollBox,但它现在应该可以访问TImage的属性和事件等。
例如,TMyPanel可以共享TImage和TScrollBox的属性:
我认为完全编写一个新的组件来完成上述行为是不合适的,我真的不知道从哪里开始。如果可以实现这一点,您可以创建一些有趣的组件,这些组件合并为一个,但保留原始属性,方法和事件等。
这就是我想在TScrollBox中使用TImage实现的目标。
解决方案
Uwe Raabe的答案按预期工作。 TImage现在在TScrollBox中注册,但显示为一个组件。 TImage的属性在Object Inspector中显示为Image。 >这将揭示TImage的属性:)
答案 0 :(得分:13)
您应该将图像作为TMyPanel的子组件:SetSubComponent
更新:这是一个例子
unit MyComponent;
interface
uses
System.Classes,
VCL.Controls,
VCL.Forms,
VCL.ExtCtrls;
type
TMyPanel = class(TScrollBox)
private
FImage: TImage;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Image: TImage read FImage;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Standard', [TMyPanel]);
end;
constructor TMyPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FImage := TImage.Create(Self);
FImage.SetSubComponent(true);
FImage.Align := alClient;
FImage.Parent := Self;
end;
destructor TMyPanel.Destroy;
begin
inherited;
end;
end.