为什么Delphi不保存自定义组件的嵌套属性?

kgz*_*kgz 2 delphi properties firemonkey

(Firemonkey,XE7)我有一个带有TTextControl祖先的组件,引入了SizeConstraints,仅基于VCL版本.设计器不会将Constraint属性保存到.FMX文件中.当我查看"视图形式为文本"时,约束不存在,即使我之前编辑了属性值(是的,我可以在Object Inspector中编辑它,但它没有保存)这段代码有什么问题?

约束定义:

TSizeConstraints = class(TObject)
...
published
...
    property MaxHeight: Single index 0 read FMaxHeight write SetConstraints;
    property MaxWidth: Single index 1 read FMaxWidth write SetConstraints;
...
end;  
Run Code Online (Sandbox Code Playgroud)

组件定义:

  ...
  published
    property Constraints : TSizeConstraints read FConstraints write SetConstraints;
  ...

procedure TMyComponent.SetConstraints(const Value: TSizeConstraints);
begin
  FConstraints.Assign(Value);
end;
Run Code Online (Sandbox Code Playgroud)

并且TSizeConstraints.Assign会复制数据:

procedure TSizeConstraints.Assign( const C : TSizeConstraints );
begin
  if Assigned( C ) then
    begin
      FMinHeight := C.FMinHeight;
      FMaxHeight := C.FMaxHeight;
      FMinWidth := C.FMinWidth;
      FMaxWidth := C.FMaxWidth;
      Change;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

我错过了什么,或者它是IDE错误?

Dav*_*nan 5

问题是你来自TObject.从中TComponent获取此类以获取流功能.或者也许TPersistent正如@NGLN所暗示的那样.

您还应该更改Assign方法以覆盖Assign引入的虚拟TPersistent.

  • 或者从TPersistent派生(ia以防止需要设置SubComponent). (2认同)