【发布时间】:2023-03-27 07:47:01
【问题描述】:
我的课程包含数据集 (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
如何将存储的地址分配给事件处理程序? 谢谢。
【问题讨论】:
-
Delphi 的哪个版本?现代 Delphi 通用容器类将完成您需要的工作。此外,您不能将事件处理程序放入
Integer。事件处理程序是对象的方法。这意味着它是两个指针。 -
对不起,忘了说:Delphi 6。
-
@DavidHeffernan 好的,我可以创建两个指针记录的列表(TMethod?)。如何从该记录中保存和恢复处理程序?