delphi通过函数名动态调用函数的方法

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TMyCacl = class(TObject)

public

{ Public declarations }

function DynamicFun(funName: string; const a, b: integer): integer;

published

function add(const a, b: integer): integer;

function dec(const a, b: integer): integer;

end;

TNewMyCacl = class(TMyCacl)

published

function Multi(const a, b: integer): integer;

end;

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

{ TMyCacl }

function TMyCacl.add(const a, b: integer): integer;

begin

result := a + b;

end;

function TMyCacl.dec(const a, b: integer): integer;

begin

result := a - b;

end;

function TMyCacl.DynamicFun(funName: string;const  a, b: integer): integer;

var

pfun: function(const a, b: integer): integer of object;

begin

if self.MethodAddress(funName) <> nil then

begin

TMethod(pfun).Code := MethodAddress(funName);

result := pfun(a, b);

end

else  result := 0;

end;

{ TNewMyCacl }

function TNewMyCacl.Multi(const a, b: integer): integer;

begin

result := a * b;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

tmp: TMyCacl;

i: integer;

begin

tmp := TNewMyCacl.Create();

if tmp.MethodAddress(‘Multi‘) <> nil  then

begin

i := tmp.DynamicFun(‘Multi‘, 102, 3);

showmessage(inttostr(i));

end;

tmp.Free;

end;

end.

时间: 2024-10-07 01:01:30

delphi通过函数名动态调用函数的方法的相关文章

Delphi 调用C/C++的Dll(stdcall关键字, 会导致函数名分裂. 此时函数名变成[email&#160;protected])

delphi调用C++写的Dll, 当然这个Dll要求是非MFC的Dll, 这样子才能被delphi调用. 根据C++定义函数的情况, Delphi有不同的相对应的处理方法.1. 声明中不加__stdcall,采用VC默认格式__cdecl,但在Delphi中要注明调用格式为cdecl.C++中例子: [cpp] view plain copy print? extern "C" int __declspec(dllexport) add(int x, int y); Delphi中例

函数名以和函数指针

调用时:(*FunP)(20);//这是通过函数指针变量FunP来调用MyFun函数的. 1 void MyFun(int x);//此处的申明也可以写成:void MyFun(int); 2 void (*FunP)(int);//此处的申明也可以写成:void (*FunP)(int);但习惯上一般不这样. 3 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 MyFun(10);//这是直接调用MyFun函数 7 FunP = MyFun;//将My

[C++程序设计]用函数指针变量调用函数

指针变量也可以指向一个函数.一个函数在编译时被分配给一个入口地址.这个函数入口地址就称为函数的指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int max(int,int); 7 int (*p)(int,int); 8 p = max; 9 int m, a, b; 10 cin >> a >> b; 11 m = p(

Js 使用new关键字调用函数和直接调用函数的区别

最近开始学习js,在看到书上的一个例子时,引发了我的一系列思考: 书上例子: function Person(name,age,job){ var o =new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return  o; } var friend=new Person("Nicholas",29,"Software Engineer&quo

Javascript 使用new 关键字调用函数和直接调用函数的区别

1.函数有返回值 $(function(){ function Person(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayHi=function(){ console.log(this.name); } return o; } var people= new Person('xiaowang',24,'developer');//new people.sayHi(); var people1

shell从函数文件中调用函数

碰到一个shell中函数调用的小问题,记录一下. shell中函数有三种调用方式,一种是在文件前面定义函数,然后在下面直接调用:一种是通过载入shell,在shell中直接调用:第三种是将函数写入文件,然后在其他shell中调用函数. 这里写一下关于第三种方法的例子: is_it_a_directory() { if [ $# -lt 1 ];then echo "is_it_a_directory:I need an argument" return 1 fi _DIRECTORY_

Javascript 自动执行函数(立即调用函数)

开头:各种原因总结一下javascript中的自动执行函数(立即调用函数)的一些方法,正文如下 在Javascript中,任何function在执行的时候都会创建一个执行上下文,因为function声明变量和function有可能只在该function内部,这个上下文,在调用function的时候,提供一些简单的方式来创建自由变量或私有子function. eg: // 由于该function里返回了另外一个function,其中这个function可以访问自由变量i // 所有说,这个内部的f

js new一个函数和直接调用函数的差别

用new和调用一个函数的差别:假设函数返回值是一个值类型(Number.String.Boolen)时,new函数将会返回这个函数的实例对象.而假设这个函数的返回值是一个引用类型(Object.Array.Funtion)时,new函数和直接调用函数的结果同样.測试代码例如以下: <script type="text/javascript"> /*//工厂模式 function Person(name,age) { var o = new Object(); o.name

打印文件名、函数名和行号的方法

java打印文件名.函数名和行号的方法:Log.d(TAG, new Exception().getStackTrace()[0].getMethodName()); //函数名 Log.d(TAG, Thread.currentThread().getStackTrace()[2].getMethodName()); //函数名 Log.d(TAG, ""+Thread.currentThread().getStackTrace()[2].getLineNumber()); //行号