一、定义TMethod = record
Code: Pointer;
Data: Pointer;
end;定义是一个记录,为什么却可以当函数调用,哪么为什么可以当一个函数来处理,如果我自己用代码实现这个功能,该如何实现?
如果我自己定义一个记录,也能当函数使用?
二、功能
刚刚百度了一下,他的主要功能就是动态地关连对像的事件,哪么如果我要关连一个对像的多个事件,是不是该定义多个这处类型的变量,还是有其它的处理方法,请高手指点刚刚在delphi 精要里面看到上面的代码,一开始不以为然,可是当我想看过程的实现代码时,却茫然了,百思不得其解。
百度了一下,只找到了他的应用方面的功能,却无讲解的贴子。CODE 是方法地址指针
DATE 是方法所属对像指针
F7 运行程序,好像相关的实现有调用汇编部份,不知是不是我眼花!
Code: Pointer;
Data: Pointer;
end;定义是一个记录,为什么却可以当函数调用,哪么为什么可以当一个函数来处理,如果我自己用代码实现这个功能,该如何实现?
如果我自己定义一个记录,也能当函数使用?
二、功能
刚刚百度了一下,他的主要功能就是动态地关连对像的事件,哪么如果我要关连一个对像的多个事件,是不是该定义多个这处类型的变量,还是有其它的处理方法,请高手指点刚刚在delphi 精要里面看到上面的代码,一开始不以为然,可是当我想看过程的实现代码时,却茫然了,百思不得其解。
百度了一下,只找到了他的应用方面的功能,却无讲解的贴子。CODE 是方法地址指针
DATE 是方法所属对像指针
F7 运行程序,好像相关的实现有调用汇编部份,不知是不是我眼花!
例如 TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
...
var
Form1: TForm1;procedure foo;
var
method: TMethod;
btn1click: TNotifyEvent;
begin
btn1click := Form1.Button1Click;
TNotifyEvent(method) := btn1click;
...
end;执行 foo 时,method.Code = @TForm1.Button1Click ,.Code 保存的是调用代码指针;method.Data = Form1,.Data 保存的是用作调用时的 Self 指针。调用的时候可以cast成 TNotifyEvent 类型再调用,不想cast的话就得内嵌汇编调了,而且调的时候需要知道自己在做什么
“当函数调用”没什么神秘的,在x86的32位编程中,只要是个4字节的变量都可以call,用汇编都是一样的代码。
想实现类似c#中的delegate功能的话,以你现在的水平是不可能完成的,核心代码必须得用汇编完成。以前利用d2009的泛型写过一个delegate,没进行过太多测试,以之前的简单测试看基本上能用:
http://www.newsmth.net/bbscon.php?bid=122&id=70363
总是给delphi 的语法之外的代码搞晕了!