如题:过程类型及方法指针的用法,请大家踊跃发言,多举例子!!!

解决方案 »

  1.   

    type
      myp=procedure(str:string;icount:int);
      mypp=procedure(strtmp:string;i:int;mybool:boolean) of object;
    上面的带与不带of object有什么区别呢?
      

  2.   

    好像没见过不带of object的
    过程指针也是个指针
    指针就是个变量,用来赋值或传参数的
      

  3.   


    都是定义过程类型,都是指针,区别是带of object指的是对象的过程,你自己用SizeOf()函数看看就明白了,
    SizeOf(myp)应该是4 SizeOf(mypp)应该是8,myp只是过程地址,mypp还包含了对象域(所属对象)
      

  4.   

    type
      myp=procedure(str:string;icount:int);;//自定义的过程类型
      mypp=procedure(strtmp:string;i:int;mybool:boolean) of object;//自定义的过程类型,最好是T开头,习惯问题,比如Tmypp
      TmainForm=Class(TForm)
      Procedure YourProc(strtmp:string;i:int;mybool:boolean);
      ...
    end
     
    var
      MainForm:TmainForm;
      Proc:mypp;
    ..... Proc:=MainForm.YourProc;//明白了?带所属对象域的
      

  5.   

    这个问题我以前回答过,你可以参考一下下面的帖子procedure of object; 有什么功能?(新手)结合上面给定帖子的文字描述,再看看下面的例子,估计你就会明白
    看看下面的例子type
      TFunc1 = procedure(Sender: TObject);
      TFunc2 = procedure(Sender: TObject) of Object;{ TForm1 }procedure TForm1.Func2(Sender: TObject);
    begin
      ShowMessage('Hello');
    end;procedure Func1(Sender: TObject);
    begin
      ShowMessage('Hello');
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      f1: TFunc1;
      f2: TFunc2;
    begin
      f1 := Func1;
      f2 := Func2;  f1(nil);
      f2(nil);
    end;把Button1Click翻译成汇编(关键部分)f1 := Func1
      mov edx,$00460108    //把函数Func1的地址给f1这个变量
    f2 := Func2  
      mov [esp + $04], eax //把Form1实例的地址给f2变量的data部分(因为Func2是在TForm1中定义的)
      mov [esp], $004600ec //把函数Func2的地址给f2变量的code部分
    f1(nil)
      mov ebx,edx  //把f1中保存的Func1的函数地址给ebx
      xor eax,eax  //为调用Func1函数准备参数(传入的是nil,因此使用xor指令清空eax)
      call ebx     //调用Func1
    f2(nil)
      xor edx,edx  //为Func2准备参数(注意,这个是Func2的第二个参数)
      mov eax,[esp+$04]  //为Func2准备第一个参数,这个参数是隐含的
      call dword ptr [esp]  //调用Func2 (注意mov [esp], $004600ec 这句,[esp]就是函数地址)