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
如何将存储的地址分配给事件处理程序?
谢谢.
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 – 保存和恢复事件处理程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)