问个函数执行的问题。 ( 积分: 5 )

  • 主题发起人 主题发起人 mill666
  • 开始时间 开始时间
M

mill666

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi里面有没有一个函数,这个函数可以根据传给它的参数执行参数值对应的函数?
比如:假设这个函数名是execfunc(fuctionname:string),
如果我要执行我自己写的函数disperrmsg,
那我想这么调用:
execfunc(disperrmsg);
我想问的就是:是否存在象execfunc这样的函数。
 
delphi里面有没有一个函数,这个函数可以根据传给它的参数执行参数值对应的函数?
比如:假设这个函数名是execfunc(fuctionname:string),
如果我要执行我自己写的函数disperrmsg,
那我想这么调用:
execfunc(disperrmsg);
我想问的就是:是否存在象execfunc这样的函数。
 
没有这样的函数,不过你可以定义一个方法对象实现类似的功能

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TMyFun=procedure of Object; //定义一个方法类

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure A1; //函数A1
procedure A2; //函数A2
procedure A3; //函数A3
procedure ExecFun(Fun:TMyFun); //执行方法
end;

var
Form1: TForm1;

implementation


{$R *.DFM}

procedure TForm1.A1;
begin
showmessage('A1');
end;

procedure TForm1.A2;
begin
showmessage('A2');
end;

procedure TForm1.A3;
begin
showmessage('A3');
end;

procedure TForm1.ExecFun(Fun:TMyFun);
begin
Fun();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ExecFun(A1);
ExecFun(A2);
ExecFun(A3);
end;

end.
 
以上例子是通过指针访问方法,如果需要通过字符串参数访问方法,可以这样:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TMyFun=procedure of Object; //定义一个方法类

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure A1; //函数A1
procedure A2; //函数A2
procedure A3; //函数A3
procedure ExecFun(Fun:string); //执行方法
end;

var
Form1: TForm1;

FunArr:array[1..3] of TMyFun;
FunStr:array[1..3] of string;

implementation


{$R *.DFM}

procedure TForm1.A1;
begin
showmessage('A1');
end;

procedure TForm1.A2;
begin
showmessage('A2');
end;

procedure TForm1.A3;
begin
showmessage('A3');
end;

procedure TForm1.ExecFun(Fun:string);
var i:integer;
begin
for i:=1 to 3 do
if Fun=FunStr then
FunArr();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FunArr[1]:=A1;
FunArr[2]:=A2;
FunArr[3]:=A3;
FunStr[1]:='A1';
FunStr[2]:='A2';
FunStr[3]:='A3';


ExecFun('A1');
ExecFun('A2');
ExecFun('A3');
end;

end.
 
// 楼主的想法基本是可以的, 简单可以这样实现:
// 以下是不带参数的函数(过程)的调用的实现, 仅供参考

procedure execfunc(myfunc : pointer);
begin
asm
call myfunc;
end;
end;

{$f+}procedure domyself; {$f-}
begin
showmessage('debug: this is procedure...');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
execfunc(@domyself);
end;
 
天河流星同志,

procedure TForm1.Button1Click(Sender: TObject);
begin
execfunc(@domyself);
end;

如果在上面的这段程序我想用变量来代替函数名,因为我的函数名是动态的,不能写死,就比如应当写成如下:

var
funcname:string

procedure TForm1.Button1Click(Sender: TObject);
begin

funcname:='domyself'
execfunc(@funcname);
end;

但是好像这样写不行。
所以想问,如果想达到这样的目的,应当怎么写??
 
天河流星同志,

procedure TForm1.Button1Click(Sender: TObject);
begin
execfunc(@domyself);
end;

如果在上面的这段程序我想用变量来代替函数名,因为我的函数名是动态的,不能写死,就比如应当写成如下:

var
funcname:string

procedure TForm1.Button1Click(Sender: TObject);
begin

funcname:='domyself'
execfunc(@funcname);
end;

但是好像这样写不行。
所以想问,如果想达到这样的目的,应当怎么写??
 
后退
顶部