为什么 Delphi 不保存自定义组件的嵌套 属性?
Why does not Delphi save a custom component's nested property?
(Firemonkey,XE7)
我有一个带有 TTextControl 祖先的组件,引入了 SizeConstraints,仅基于 VCL 版本。
设计器不会将约束 属性 保存到 .FMX 文件中。
当我查看 "view form as text" 时,约束不存在,即使我之前编辑了 属性 值(是的,我可以在对象检查器中编辑它,但它没有保存)
这段代码有什么问题?
约束定义:
TSizeConstraints = class(TObject)
...
published
...
property MaxHeight: Single index 0 read FMaxHeight write SetConstraints;
property MaxWidth: Single index 1 read FMaxWidth write SetConstraints;
...
end;
组件定义:
...
published
property Constraints : TSizeConstraints read FConstraints write SetConstraints;
...
procedure TMyComponent.SetConstraints(const Value: TSizeConstraints);
begin
FConstraints.Assign(Value);
end;
并且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;
我错过了什么,还是 IDE 错误?
问题是您派生自 TObject
。从 TComponent
派生此 class 以获得流媒体功能。或者可能 TPersistent
正如@NGLN 所建议的那样。
您还应该更改 Assign
方法以覆盖 TPersistent
中引入的虚拟 Assign
。
(Firemonkey,XE7) 我有一个带有 TTextControl 祖先的组件,引入了 SizeConstraints,仅基于 VCL 版本。 设计器不会将约束 属性 保存到 .FMX 文件中。 当我查看 "view form as text" 时,约束不存在,即使我之前编辑了 属性 值(是的,我可以在对象检查器中编辑它,但它没有保存) 这段代码有什么问题?
约束定义:
TSizeConstraints = class(TObject)
...
published
...
property MaxHeight: Single index 0 read FMaxHeight write SetConstraints;
property MaxWidth: Single index 1 read FMaxWidth write SetConstraints;
...
end;
组件定义:
...
published
property Constraints : TSizeConstraints read FConstraints write SetConstraints;
...
procedure TMyComponent.SetConstraints(const Value: TSizeConstraints);
begin
FConstraints.Assign(Value);
end;
并且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;
我错过了什么,还是 IDE 错误?
问题是您派生自 TObject
。从 TComponent
派生此 class 以获得流媒体功能。或者可能 TPersistent
正如@NGLN 所建议的那样。
您还应该更改 Assign
方法以覆盖 TPersistent
中引入的虚拟 Assign
。