【发布时间】: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