组件创建 - 将组件连接在一起?

时间:2012-02-28 10:01:54

标签: delphi

我是组件创建的新手,正在尝试使用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.

如果我将上述内容编译并安装到包中,结果如下所示:

enter image description here

enter image description here

问题

我希望将我的组件注册为一个组件。但该组件应该是TScrollBox和TImage的组合。主要组件将是TScrollBox,但它现在应该可以访问TImage的属性和事件等。

例如,TMyPanel可以共享TImage和TScrollBox的属性:

  • 自动调整大小
  • 边框
  • HorzScrollBar
  • ParentBackground
  • 图片
  • VertScrollBar

我认为完全编写一个新的组件来完成上述行为是不合适的,我真的不知道从哪里开始。如果可以实现这一点,您可以创建一些有趣的组件,这些组件合并为一个,但保留原始属性,方法和事件等。

这就是我想在TScrollBox中使用TImage实现的目标。

解决方案

Uwe Raabe的答案按预期工作。 TImage现在在TScrollBox中注册,但显示为一个组件。 TImage的属性在Object Inspector中显示为Image。 >这将揭示TImage的属性:)

1 个答案:

答案 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.