一、定义TMethod = record
  Code: Pointer;
  Data: Pointer;
end;定义是一个记录,为什么却可以当函数调用,哪么为什么可以当一个函数来处理,如果我自己用代码实现这个功能,该如何实现?
如果我自己定义一个记录,也能当函数使用?
二、功能
    刚刚百度了一下,他的主要功能就是动态地关连对像的事件,哪么如果我要关连一个对像的多个事件,是不是该定义多个这处类型的变量,还是有其它的处理方法,请高手指点刚刚在delphi 精要里面看到上面的代码,一开始不以为然,可是当我想看过程的实现代码时,却茫然了,百思不得其解。
百度了一下,只找到了他的应用方面的功能,却无讲解的贴子。CODE 是方法地址指针
DATE 是方法所属对像指针
F7 运行程序,好像相关的实现有调用汇编部份,不知是不是我眼花!

解决方案 »

  1.   

    所有的 procedure/function (...): T of object 都是一个 TMethod 结构
    例如 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
      

  2.   

    这个是不是在编译器中做了些特别的处理啊?
    总是给delphi 的语法之外的代码搞晕了!
      

  3.   

    记录其实就是一段内存数据,只要符合内存结构就可以了。例如说最典型的就是我们可以把TMessage变成TAAAMessage、TBBBMessage、TCCCMessage等。DELPHI的方法调用的数据结构就是TMethod的那样,所以我们塞个TMethod过去就可以了。至于编译是否通过的话,估计是作了特殊处理不奇怪。
      

  4.   

    就是保存了函数指针(地址)而已,加上方法还比函数需要多(自动)传入的self