保存和恢复事件处理程序

2023-12-24

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

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)。更简单并允许来自其他对象的事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保存和恢复事件处理程序 的相关文章

随机推荐