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

delphi – 保存和恢复事件处理程序,第1张

概述我的类包含数据集(TDataSet).我班级的用户可以为此数据集分配事件处理程序: ds.FieldByName('ID').OnChange := @ID_OnChange; 然后我必须重新打开数据集: ds.Close;ds.Open; 在此之后,所有事件处理程序都消失了: if Assigned(ds.FieldByName('ID').OnChange) //returns false 我的类包含数据集(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;interfaceuses  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 – 保存和恢复事件处理程序全部内容,希望文章能够帮你解决delphi – 保存和恢复事件处理程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1256296.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存