我想知道以下是否可能,如果是,怎么样?代码示例请。
我想要做的是将'方法指针'存储在TComponent派生对象的整数Tag值中,稍后调用存储的方法。您可以假设所有met方法具有相同的定义。
谢谢!
答案 0 :(得分:9)
不,这是不可能的。对象的方法等同于TMethod:
TMethod = record
Code, Data: Pointer;
end;
Code
字段是方法的地址,Data
字段是传递给每个对象方法的隐藏Self
字段。该记录与Int64的大小相同,因此如果将其转换为普通的整数,则会丢失一半。
您可以使用GetMem在堆上分配TMethod记录,然后将其存储在Tag属性中,只要您记得在完成后将其释放即可。
答案 1 :(得分:6)
你可以解决方法,但这不是很好的设计......
var
Method: ^TNotifyEvent;
begin
//Create New method
GetMem(Method, SizeOf(TNotifyEvent));
//Init target Tag
Tag := Integer(Method);
//Store some method
Method^ := Button1Click;
//call stored method
Method := (Pointer(Tag));
Method^(self);
//And don't forget to call in to object destructor...
if Tag <> 0 then
FreeMem(pointer(Tag));