如何用函数名字符串来调用函数

时间:2010-03-02 18:02:12  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:带了参数就不能实现了,谁能解决??type{$M+}TMyObj = classpublishedfunction CommandOne: Integer;// function CommandEx(i:integer): Integer; 这个带了参数就会出现错误end;{$M-}function DoCommand1(const Command: string): Integer;varComm...
  正文:如何用函数名字符串来调用函数?    
    
比如我有一些函数(过程),我需要掉用他们,能不能通过函数名字符串来调用?有点儿象宏替换的意思!

以下的只能对于过程或不带参数的函数,如果函数带了参数就不能实现了,谁能解决??

type

{$M+}

TMyObj = class

published

function CommandOne: Integer;

// function CommandEx(i:integer): Integer; 这个带了参数就会出现错误

end;

{$M-}

function DoCommand1(const Command: string): Integer;

var

CommandProc: function: Integer of object;

begin

TMethod(CommandProc).Code := TMyObj.MethodAddress(Command);

if Assigned(TMethod(CommandProc).Code) then Result := CommandProc;

end;

function TMyObj.CommandOne: Integer;

begin

result:=1;

end;

{function TMyObj.CommandEx(i:integer): Integer;

begin

result:=i;

end;}

procedure TForm1.Button2Click(Sender: TObject);

begin

DoCommand1('CommandOne');

//DoCommand1('CommandEx(9)'); 这个就会出错

end;

--

WBR, LVT.

photoshop/ target=_blank class=infotextkey>ps: A second method by V.Titov :

uses

TypInfo;

type

TCommand = (CommandOne, CommandTwo, CommandThree, CommandFour);

function DoCommand2(const Command: string): Integer;

begin

Result := 0;

case TCommand(GetEnumValue(TypeInfo(TCommand), Command)) of

CommandOne: ..;

CommandTwo: ..;

CommandThree: ..;

CommandFour: ..;

end;

end;

*******************

回复人: chinalian(连长) ( ) 信誉:100 2002-4-20 14:08:16 得分:0

函数指针:

TVisitedEvent = function(FID: integer):integer of object;

你增加如下

function DoCommand2(const Command: string;id: integer): Integer;

var

CommandProc: function(id: interger): Integer of object;

begin

TMethod(CommandProc).Code := TMyObj.MethodAddress(Command);

if Assigned(TMethod(CommandProc).Code) then Result := CommandProc(id); //注意参数

end;

应该就可以调用带参数的。

回复人: kiss2(kiss2@yeah.net) ( ) 信誉:110 2002-4-20 14:55:28 得分:0

thanks to chinalian(连长): 终于可以调用带参数的了。

但是,由于函数很多,而且每个函数的参数都是不同的,不知道怎么实现?是不是定义每个函数名呢?我的方法 是这样的,但是很麻烦。如下:

type

PTfuncjg = ^Tfuncjg;

Tfuncjg = record

pt1 : Integer;

pt2 : string;

{还有n个参数类型}

end;

function DoCommand2(const Command: string;pt: PTfuncjg): Integer;

var

CommandProc: function(id: interger): Integer of object;

CommandProc2: function(str: string): Integer of object;

{还有n个函数}

begin

new(pt);

if command='com1' then

begin

TMethod(CommandProc).Code := TMyObj.MethodAddress(Command);

if Assigned(TMethod(CommandProc).Code) then Result := CommandProc(pt.pt1);

end;

if command='com2' then

begin

TMethod(CommandProc2).Code := TMyObj.MethodAddress(Command);

if Assigned(TMethod(CommandProc2).Code) then Result := CommandProc2(pt.pt2);

end;

//这样如果有N个函数,就要写N次了,有没有办法更简单点,而且速度也快点

end;

回复人: chinalian(连长) ( ) 信誉:100 2002-4-20 17:01:40 得分:0

kiss2(kiss2@yeah.net):

你可以将N个函数根据不同的参数个数和参数类型归结为M类别,如:I2D1(代表前两个参数为integer,第 三个为double)等;然后,在function DoCommand2中增加一个参数指出为哪个类别,则只要针对这M个类别写 出不同的情况就可以了。有良好的设计的话,M应该不会大。比如 "如何用函数名字符串来调用函数"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/12994.html


关键字:

关于《如何用函数名字符串来调用函数》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td