大哥大姐们怎么根据名称的字符串值去调用函数啊,我搜索了半天找到一个但是有局限性,我的函数是放在一个新建的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
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
你放包里就好啦
干什么用字符串调用的
procedure TForm1.CallMethod(AObject: TObject; AMethodName: String);
begin
TProcedure(AObject.MethodAddress(AMethodName));
end;
这样就可以调用了,不用如一楼这么复杂。
但有个前提,就是AMethodName指定的方法必须是在Published段中声明的。
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;
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.