我创建了一个包含以下内容的组件,然后通过创建相应的gettersetter对来传播嵌套组件的必要属性。
TEditLine = class(TCustomControl)
strict private
FCaptionLabel: TLabel;
FUnitLabel: TLabel;
FEdit: TMyEdit;
end;
然后我开始通过创建相应的gettersetter对来传播嵌套组件的必要属性。
我突然想到,如果将这些嵌套组件本身发布为只读属性,那么当一些新的属性或方法被引入到这些组件中时,不需要改变容器组件的接口,这样可能会更容易。
TEditLine = class(TCustomControl)
strict private
FCaptionLabel: TLabel;
FUnitLabel: TLabel;
FEdit: TMyEdit;
published
property CaptionLabel: TLabel read FCaptionLabel;
property UnitLabel: TLabel read FUnitLabel;
property Edit: TMyEdit read FEdit;
end;
当我把组件放在表单上时,我在对象检查器中看到CaptionLabel、UnitLabel和Edit,但这是我能实现的所有功能。
一般来说,这样做是好主意吗?我如何解决上面列出的两个问题?
TComponent
-的属性默认被视为对外部组件的引用,除非你调用了 SetSubComponent(True)
的对象上,例如。
TEditLine = class(TCustomControl)
strict private
FCaptionLabel: TLabel;
FUnitLabel: TLabel;
FEdit: TMyEdit;
public
constructor Create(AOwner: TComponent); override;
published
property CaptionLabel: TLabel read FCaptionLabel;
property UnitLabel: TLabel read FUnitLabel;
property Edit: TMyEdit read FEdit;
end;
...
constructor TEditLine.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
...
FCaptionLabel := TLabel.Create(Self);
FCaptionLabel.Parent := Self;
FCaptionLabel.SetSubComponent(True); // <-- ADD THIS
...
FUnitLabel := TLabel.Create(Self);
FUnitLabel.Parent := Self;
FUnitLabel.SetSubComponent(True); // <-- ADD THIS
...
FEdit := TMyEdit.Create(Self);
FEdit.Parent := Self;
FEdit.SetSubComponent(True); // <-- ADD THIS
...
end;