发布的嵌套组件的属性不被保存,事件在对象检查器中不可见。

问题描述 投票:0回答:1

我创建了一个包含以下内容的组件,然后通过创建相应的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,但这是我能实现的所有功能。

  • 嵌套组件的属性不能保存到DFM中。
  • 它们的事件在对象检查器中不可见。

一般来说,这样做是好主意吗?我如何解决上面列出的两个问题?

components delphi-xe5
1个回答
1
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.