gpt4 book ai didi

delphi - 监控对象属性值的变化

转载 作者:行者123 更新时间:2023-12-03 15:46:46 25 4
gpt4 key购买 nike

我想监督一个类的实例。每当该对象的属性发生更改时,我希望能够检查该属性,而无需自己实现该功能。特别是当该类具有大量属性时。

我有一个这样的类(class):

TMyClass = class
private
FTest1: Integer;
...
FTestN: Integer;
public
property Test1: Integer read FTest1 write FTest1;
...
property TestN: Integer read FTest1 write FTest1;
end.

当使用这个类时:

c := TMyClass.Create;

如果有这样的东西那就太棒了:

c.changed // -> false
c.Test1 := 1;
c.changed // -> true

有标准方法可以做到这一点吗?

最佳答案

使用的典型模式是属性中的 setter 方法,正如 Brian 在选项 #1 中所说的那样。我想给你写一些示例代码,这样你就可以看到人们做了什么。

请注意,NameChanged 是一个虚拟方法,因为我可能想要声明一个基类 TPersonInfo,然后稍后为 TJanitorInfo 创建一个子类,而 TJanitorInfo 可能有一个更复杂的 NameChanged 实现。因此,处理属性值更改的一级规划是子类可以重写方法。但对于不是子类的东西,您在问题中建议将 bool 标志设置为 true。这将需要在某处“重复检查该标志”(称为轮询)。最终可能会导致工作量超出其值(value)。也许您需要的是下面显示的“事件”,也称为“回调”或“指向方法的指针”。在delphi 中,这些属性以单词On 开头。 OnNameChanged 就是这样一个事件。

 type
TPersonInfo = class
private
FName:String;
FOnChangedProperty:TNotifyEvent;
protected
procedure SetName(aName:String);
procedure NameChanged; virtual;
published
property Name:String read fName write SetName;

property OnChangedProperty:TNotifyEvent read FOnChangedProperty write FOnChangedProperty;

end;

...
implementation

procedure TPersonInfo.SetName(aName:String);
begin
if aName<>FName then begin
aName := FName;
NameChanged;
end;
end;

procedure NameChanged; virtual;
begin
// option A: set a boolean flag. Exercise for reader: When does this turn off?
FNameChanged := true;
// option B: refresh visual control because a property changed:
Refresh;
// option C: something else (math or logic) might need to be notified
if Assigned(FOnChangedProperty) then
FOnChangedProperty(Self);
end;

关于delphi - 监控对象属性值的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945989/

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