gpt4 book ai didi

delphi - 记录可以用作对象的属性吗?

转载 作者:行者123 更新时间:2023-12-03 14:38:01 24 4
gpt4 key购买 nike

我想将记录作为对象的属性。问题是,当我更改该记录的某个字段时,该对象不知道这一更改。

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;

...不会工作。

那么,当记录的字段之一被写入时,如何使属性设置过程“捕获”呢?也许在如何声明记录方面有一些技巧?

更多信息

我的目标是避免创建 TObjectTPersistentOnChange事件(例如 TFontTStringList )。我非常熟悉为此使用对象,但为了稍微清理一下我的代码,我想看看是否可以使用记录来代替。我只需要确保当我设置记录的字段之一时可以正确调用我的记录属性 setter 。

最佳答案

考虑这一行:

MyObject.SomeRecord.SomeField := NewValue;

这实际上是一个编译错误:

[DCC Error]: E2064 Left side cannot be assigned to

你的实际代码可能是这样的:

MyRecord := MyObject.SomeRecord;
MyRecord.SomeField := NewValue;

这里发生的情况是将记录类型的复制到局部变量MyRecord。然后,您可以修改此本地副本的字段。这不会修改 MyObject 中保存的记录。为此,您需要调用属性 setter 。

MyRecord := MyObject.SomeRecord;
MyRecord.SomeField := NewValue;
MyObject.SomeRecord := MyRecord;

或者切换到使用引用类型,即类,而不是记录。

总而言之,当前代码的问题是未调用 SetSomeRecord,而是修改记录的副本。这是因为记录是值类型,而不是引用类型

关于delphi - 记录可以用作对象的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9156401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com