【问题标题】:Component Creation - Joining Components Together?组件创建 - 将组件连接在一起?
【发布时间】:2012-03-17 19:15:55
【问题描述】:

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

  • 自动调整大小
  • 边框样式
  • HorzScrollBar
  • 父背景
  • 图片
  • 垂直滚动条

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

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

解决方案

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

【问题讨论】:

  • 请注意,您必须提供Self 作为子组件的所有者。使用与 TMyPanel 相同的所有者将导致 DFM 污染和流问题。
  • 确实,你还是没有做对。请参阅我的更新答案。
  • +1 感谢 Uwe 展示示例。
  • 和 +1 NGLN 以获取警告提示。

标签: delphi


【解决方案1】:

您应该将图像设为 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.

【讨论】:

  • +1 感谢您的快速回复,我感觉可能还有其他事情需要做。让我多看看这篇文章..
  • 使用上面显示的方法,已发布的 Image 属性应该在 Object Inspector 中可见且可展开。
  • 我建议命名子组件。现在对象检查器将显示 MyPanel. ,但它可能看起来像 MyPanel.SubImage .
  • 感谢 NGLN 的建议,我将为 TImage 使用适当的名称。
  • @Altar,如果您不使用子组件方法,那将是正确的。子组件的父级不是由 DFM 系统处理,而是由外部组件处理。实际上,子组件在 DFM 中不存在,只有它的属性被写为外部组件的属性的一部分。如果您省略设置父级,它将根本不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2017-06-03
  • 2018-10-01
  • 1970-01-01
相关资源
最近更新 更多