我想将记录作为对象的属性。问题是,当我更改该记录的某个字段时,该对象不知道这一更改。
type
TMyRecord = record
SomeField: Integer;
end;
TMyObject = class(TObject)
private
FSomeRecord: TMyRecord;
procedure SetSomeRecord(const Value: TMyRecord);
public
property SomeRecord: TMyRecord read FSomeRecord write SetSomeRecord;
end;
然后如果我这样做...
MyObject.SomeRecord.SomeField:= 5;
...不管用。
那么,当写入记录的字段之一时,如何使属性设置过程“捕获”呢?也许在如何申报记录方面有一些技巧?
更多信息
我的目标是避免创建一个TObject
or TPersistent
与OnChange
事件(例如TFont
or TStringList
)。我非常熟悉为此使用对象,但试图cleanup我的代码有点,我看看是否可以使用记录代替。我只需要确保当我设置记录的字段之一时可以正确调用我的记录属性设置器。
考虑这一行:
MyObject.SomeRecord.SomeField := NewValue;
这实际上是一个编译错误:
[DCC 错误]:E2064 左侧无法分配给
你的实际代码可能是这样的:
MyRecord := MyObject.SomeRecord;
MyRecord.SomeField := NewValue;
这里发生的事情是你复制value记录类型到局部变量MyRecord
。然后,您可以修改此本地副本的字段。这不会修改 MyObject 中保存的记录。为此,您需要调用属性设置器。
MyRecord := MyObject.SomeRecord;
MyRecord.SomeField := NewValue;
MyObject.SomeRecord := MyRecord;
或者切换到使用引用类型,即类,而不是记录。
总而言之,当前代码的问题是未调用 SetSomeRecord,而是修改记录的副本。这是因为记录是值类型而不是成为参考类型.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)