delphi – 保存和恢复事件处理程序
发布时间:2020-12-15 09:24:51 所属栏目:大数据 来源:网络整理
导读:我的类包含数据集(TDataSet).我班级的用户可以为此数据集分配事件处理程序: ds.FieldByName('ID').OnChange := @ID_OnChange; 然后我必须重新打开数据集: ds.Close;ds.Open; 在此之后,所有事件处理程序都消失了: if Assigned(ds.FieldByName('ID').OnChan
我的类包含数据集(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)的分配事件.更简单并允许来自其他对象的事件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |