当我构建自定义组件时,我可能会实现已发布的持久属性。例如......
type
TMyComponent = class(TComponent)
private
FMyPersistent: TMyPersistent;
...
public
...
published
property MyPersistent: TMyPersistent read FMyPersistent write SetMyPersistent;
...
end;
请注意,过程SetMyPersistent
尚未到位,这就是下一步的来源。我右键单击此对象并选择“Cursor完成类”(或Shift + Control + C
)以调用代码完成。当它自动创建此属性设置器时,它会自动将赋值代码放入...
procedure TMyComponent.SetMyPersistent(const Value: TMyPersistent);
begin
FMyPersistent := Value;
end;
现在很高兴它继续为我完成了这项任务。但是,在正常情况下,我一直习惯于使用......
procedure TMyComponent.SetMyPersistent(const Value: TMyPersistent);
begin
FMyPersistent.Assign(Value);
end;
如果属性类型为String
或Integer
,则直接分配是正确的方法。但是,在实施TPersistent
的已发布属性时,使用TPersistent.Assign
不是正确的方法吗?
使用这两种分配机制之间的本质区别是什么?因为如果使用TPersistent.Assign
是合适的事情,那么代码完成有一个小缺陷 - 也就是说,假设FMyPersistent := Value
被认为是“错误的”。
答案 0 :(得分:3)
致电Assign
。这就是为什么你首先拥有一个属性设置器。如果你要直接覆盖该字段,则不需要setter。覆盖它会泄漏您在构造函数中创建的原始对象。在Object Inspector中修改属性时,您还会注意到IDE中的访问冲突。
代码完成将相同的代码放在它创建的每个setter中。对于在最终将值存储在字段中之前需要执行其他工作的属性,因此field-storage语句是正确的。 IDE不知道你真正想要的是什么。
答案 1 :(得分:3)
你应该问自己的问题是 - 谁拥有涉及的对象?如果您的组件创建并拥有FMyPersistent
,请使用FMyPersistent.Assign(Value)
将值从Value
复制到FPersistent
。如果FMyPersistent
仅指向其他人拥有的外部对象,则改为使用FMyPersistent := Value
。