我刚开始学习组件创建,并尝试使用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的属性:
- AutoSize
- BorderStyle
- HorzScrollBar
- ParentBackground
- Picture
- VertScrollBar
我认为完全编写一个新组件来实现上述行为会过于冗长,而且我真的不知道从何开始。如果可以实现这一点,您可以创建一些有趣的组件,将它们组合成一个组件,但保留它们的原始属性、方法和事件等。
这就是我想要在TScrollBox内部放置TImage的效果。
解决方案
Uwe Raabe的答案已经可以正常工作。TImage现在注册在TScrollBox中,但是看起来像一个组件。TImage的属性在对象检查器中显示为Image,这将显示TImage的属性:)
Self
作为子组件的所有者。如果使用与TMyPanel
相同的所有者,则会导致DFM污染和流媒体问题。 - NGLN