代码之家  ›  专栏  ›  技术社区  ›  Paul

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

  •  0
  • Paul  · 技术社区  · 5 年前

    我创建了一个包含以下内容的组件:

    TEditLine = class(TCustomControl)
    strict private
      FCaptionLabel: TLabel;
      FUnitLabel: TLabel;
      FEdit: TMyEdit;
    end;
    

    然后,我开始通过创建相应的getter/setter对来传播嵌套组件的必要属性。

    我突然想到,将这些嵌套组件本身发布为只读属性可能更容易,这样,当向其中一个组件引入某些新属性或方法时,就不需要更改容器组件接口:

    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;
    

    当我把组件放到表单上时,我在objectinspector中看到了CaptionLabel、UnitLabel和Edit,但这就是我所能做到的。

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

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

    0 回复  |  直到 5 年前
        1
  •  1
  •   Remy Lebeau    5 年前

    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;