有一个对象的回调
type TTriggerCallback = procedure(Sender: TObject; Props: TBasicTriggerProps) of object;
我将回调的地址添加到列表中
(TriggerList.Objects[Index] as TList).Add(@Callback);
Callback 是一个表单过程
procedure TForm1.FormCreate(Sender: TObject);
begin
TriggerFac := TTriggerFactory.Create;
TriggerFac.AttachTrigger('OnNoGuiBootChanged', Self.OnNoGuiBootChanged);
end;
但是当我尝试调用这样的存储函数时,我得到了访问冲突。
var cbkptr: ^TTriggerCallback;
list := TriggerList.Objects[index] as TList;
for I := list.Count-1 downto 0 do begin
cbkptr := list.Items[i];
try
cbkptr^(Sender, Props);
finally
end;
end;
同时,@Callback
输入和cbkptr
输出地址相同,据我了解,似乎Self对象根本没有传输。因为如果你删除 object 并将 Self 作为第一个参数传递,那么一切正常,但在这种情况下它不会。
有没有人有关于如何解决这个问题的建议?
ps:我使用的是Delphi 7,所以TList<TTriggerCallback>
我没有它,必须使用直接地址。
procedure of object
作为记录实施where
Code
是指向方法本身的指针,并且Data
是您要为其调用方法的对象如果您需要将此回调保存到列表中,则需要此代码
称呼
好吧,不要忘记调用
FreeMem
列表的每个元素第二种方式是写一个包装对象
并添加
称呼
TTriggerCallbackWraper 类的实例必须通过调用
Free
. 或者改为TList
使用TObjectList
withOwnObjects := True
;