• TMethod


    onclick是TNotifyEvent类型;    

    type  

      TNotifyEvent   =   procedure(Sender:   TObject)   of   object;    

    就是说他是一个过程,而且是有一个TObject的参数,并且包含在一个对象里~~  

    关于类的方法:   (不是类方法,这里指object   pascal中的静态方法,相当于C++的成员函数)        

    1:   带有隐含参数   self        

    2:   方法是方法,数据是数据。        

    3:Delphi的方法是一个结构              

    type                  

    TMethod   =   record                      

      Code:   Pointer;     //方法的入口地址                      

      Data:   Pointer;     //类实例指针(Self参数)                  

    end;        

    我们调用类的方法,其实分为2个部分,        

    1:调用方法的代码,通过类来获得方法入口地址。        

    2:访问对象的数据(也可能不访问),通过类的方法的那个隐含参数Self来访问。  

    我做了一个测试:        

    TMyObject   =   class        

      private            

        FName:   string;        

      public            

        procedure   ChangeName(AName:   string);            

        procedure   ShowPrivate;        

    end;        

    procedure   TMyObject.ChangeName(AName:   string);    

    begin        

      FName   :=   AName;   //修改私有变量        

      ShowMessage('My   name   is   to   be   changed   to   '   +   AName);    

    end;        

    procedure   TMyObject.ShowPrivate;    

    begin        

      ShowMessage('My   name   is   '   +   FName);    

    end;        

    procedure  

    TForm1.Button1Click(Sender:   TObject);    

    type        

    TCallFun   =   procedure(AName:   string)   of   object;    

    var        

    E:   TMyObject;        

    M:   TMethod;    

    begin        

       E   :=   TMyObject.Create;        

      M.Code   :=   @TMyObject.ChangeName;   //这里设置要访问的方法的入口地址        

      M.Data   :=   @Pointer(E)^;       //设置Self参数,即类实例指针 @Pointer(E)^与Pointer(E)一样的         TCallFun(M)('Xbl');        

      E.ShowPrivate;     //My   name   is   Xbl        

      E.Free;    

    end;    

     

      delphi里的普通函数指针pointer 为4个字节,但是对象的方法指针是8个字节,由对象指针self(4字节)和函数指针(4字节)组合而成. 将普通的函数指针变成对象的方法指针就不是难事了.

    下面是简单的例子代码.

    procedure  Button2Click(Sender: TObject);  //这里是一个普通的函数

    implementation {$R *.DFM}

    procedure  Button2Click(Sender: TObject);

    begin  

      ShowMessage('1');

    end;

    procedure TForm1.Button1Click(Sender: TObject);

    var  

      Method: TMethod;

    begin  

      Method.Code := @Button2Click;      //取得Button2Click函数指针  

      Method.Data := nil;                               //也可以是self  

      Button2.OnClick := TNotifyEvent(Method);

    end;  

     

    How to execute a method (procedure/function) by name Category: Pascal Here's a simple trick to execute a Delphi object's method by name: ~~~~~~~~~~~~~~~~~~~~~~~~~

    type

    TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject) ;

    procedure CallMeByName(Sender: TObject) ;

    private

    procedure ExecMethod(OnObject: TObject; MethodName: string) ;

    end;

    var

    Form1: TForm1;

    type

    TExec = procedure of object;

    procedure TForm1.ExecMethod(OnObject: TObject; MethodName: string) ;

    var

    Routine: TMethod;

    Exec: TExec;

    begin

    Routine.Data := Pointer(OnObject) ;

    Routine.Code := OnObject.MethodAddress(MethodName) ;

    if NOT Assigned(Routine.Code) then Exit;

    Exec := TExec(Routine) ;

    Exec;

    end;

    procedure TForm1.CallMeByName(Sender: TObject) ;

    begin

    ShowMessage('Hello Delphi!') ;

    end;

    procedure TForm1.Button1Click(Sender: TObject) ;

    begin

    ExecMethod(Form1, 'CallMeByName') ;

    end;

  • 相关阅读:
    HDU3555:Bomb
    入门OJ:售货员的难题
    Zju1100 Mondriaan
    与图论的邂逅08:树上倍增
    入门OJ:八中生成树2
    Poj2286 The Rotation Game
    P1379 八数码难题
    [SCOI2005]骑士精神
    与图论的邂逅07:K短路
    [Usaco2007 Feb]Cow Party
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/5753165.html
Copyright © 2020-2023  润新知