delphi通过函数名动态调用函数的方法(方便功能的扩展)
2017-09-02 21:26
781 查看
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.
以上代码实现了类中通过函数名动态调用函数的方法,这样处理的一个优点是使类的复用性与扩展性得到加强,比如上例中,之前有一个类TMyCacl,能实现对a与b做加法与减法运算,
假如今后需求变化,需要增加其他运算时,可通过继承该类,重新写一个新运算方法,但是调用还用利用DynamicFun函数,这样在原来的类不要做修改的前提下,很好的实现功能的扩展。
这里一定要注意的是,需要被动态条用的函数一定要是 published 类型,否则MethodAddress将无法获取该函数。
分类: delphi
相关文章推荐
- delphi通过函数名动态调用函数的方法(方便功能的扩展)
- Delphi 使用 RTTI 动态通过名称调用函数和设置控件属性值
- 详解C#中通过委托来实现回调函数功能的方法
- CCRenderTexture(动态创建纹理类 ---通过OpenGL方法 可以实现截屏功能)
- Mootools中使用extend和implement给你的函数扩展功能或方法
- DELPHI中的静态虚拟及动态方法函数的区别
- 1、通过函数实现打印*号组成的直角三角形,函数要求传入行数即可。在main 方法中,通过用户输入得到行数,然后调用函数做打印。 三角形样式: * ** *** **** ***** ******
- Mootools中使用extend和implement给你的函数扩展功能或方法
- C#动态加载dll扩展系统功能的方法
- 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法
- 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法
- 给出函数atoi(x)的实现方法,其功能是将字符串x转换为整数
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?(转)
- Delphi 学习之函数 ③ 扩展的位操作函数
- 通过客户端扩展实现固定GridView表头功能
- vue2.0项目中的函数封装和引用。演示通过封装jsonp方法获取QQ音乐数据。
- JavaScript通过attachEvent和detachEvent方法处理带参数的函数
- Delphi中Ocx的动态注册方法
- JavaScript通过select动态更换图片的方法
- PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法