gpt4 book ai didi

delphi - 保存和恢复事件处理程序

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

我的类包含数据集(TDataSet)。我的类(class)的用户可以为此数据集分配事件处理程序:

ds.FieldByName('ID').OnChange := @ID_OnChange;

然后我必须重新打开数据集:

ds.Close;
ds.Open;

此后所有事件处理程序都消失了:

if Assigned(ds.FieldByName('ID').OnChange) //returns false

所以,我需要保存处理程序并在重新打开后恢复它们。我使用 TStringList 来实现:

var
EventHandlers: TStringList;
...
//I do this for every event of every field
if Assigned(ds.FieldByName('ID').OnChange) then
EventHandlers.AddObject('ID', @ds.FieldByName('ID').OnChange);

问题是如何恢复处理程序:

ds.FieldByName('ID').OnChange := TFieldNotifyEvent(ObjToInt(EventHandlers.Objects[0]));//Invalid typecast error

如何将存储的地址分配给事件处理程序?谢谢。

最佳答案

如果你确实想保存事件,你可以使用TMethod Record:

unit Unit6;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm6 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MTD : TMethod;
end;

var
Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.btn1Click(Sender: TObject);
begin
ShowMessage('Hello World!');
end;

procedure TForm6.btn2Click(Sender: TObject);
begin
ShowMessage('I am copy cat!');
MTD := TMethod(btn1.OnClick);
btn2.OnClick := TNotifyEvent(MTD);
end;

end.

第一次点击 Btn2 将显示“我是模仿猫!”第二个将显示 Hello World。

编辑:改进向 MTD(TMethod) 分配事件。更简单并允许来自其他对象的事件。

关于delphi - 保存和恢复事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9585956/

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