大哥大姐们怎么根据名称的字符串值去调用函数啊,我搜索了半天找到一个但是有局限性,我的函数是放在一个新建的unit里面的并不是form1里面,大哥大姐帮帮忙,一下是在form1里面可以用的代码
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;
本文来自Delphi之窗,原文地址:http://www.52delphi.com

解决方案 »

  1.   

    而且新建的unit 名字也不固定,有很多比如aaa,bbb,ccc
      

  2.   

      你放在Unit中的函数,本来就可以用函数名称直接调用的
      你放包里就好啦
      干什么用字符串调用的
      
      

  3.   


    procedure TForm1.CallMethod(AObject: TObject; AMethodName: String);
    begin
      TProcedure(AObject.MethodAddress(AMethodName));
    end;
    这样就可以调用了,不用如一楼这么复杂。
    但有个前提,就是AMethodName指定的方法必须是在Published段中声明的。
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
     showmessage(self.caption);  //如果Button2Click,则Self为nil 
     Memo1.Lines.Add('Shenqw');   //相当于Self.Memo1.Lines.Add('Shenqw'); 
    end; procedure TForm1.Button2Click(Sender: TObject); 
    var 
     a:TNotifyEvent; 
    begin 
     a:=nil; 
     @a:=MethodAddress('Button1Click'); 
     showmessage(self.caption); 
     a(Sender); 
    end; 
      

  5.   

     published 
     procedure MyRoutine(const Msg: string); 
         { Public declarations } 
     end; var 
     Form1: TForm1; 
    implementation {$R *.dfm} { TForm1 } procedure TForm1.MyRoutine(const Msg: string); 
    begin 
    MessageDlg(Msg, mtInformation, [mbOk], 0); 
    end; procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    ShowMessage('A button was pushed... or was it?'); 
    end; procedure TForm1.Button2Click(Sender: TObject); 
    var 
     Proc: TNotifyEvent; 
    begin 
     @Proc := MethodAddress('Button1Click'); 
     if Assigned(Proc) then 
       Proc(nil); 
    end; procedure TForm1.Button3Click(Sender: TObject); 
    var 
    Proc1: TCustomProc; 
    begin 
     @Proc1 :=self.MethodAddress('MyRoutine');  if  Assigned(Proc1) then 
       Proc1('Hello world'); 
    end; procedure TForm1.Button4Click(Sender: TObject); 
    begin 
    MyRoutine(''); 
    end; end.