博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
delphi通过函数名动态调用函数的方法(方便功能的扩展)
阅读量:4974 次
发布时间:2019-06-12

本文共 1804 字,大约阅读时间需要 6 分钟。

unit Unit1;interfaceuses  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将无法获取该函数。

转载于:https://www.cnblogs.com/tangqs/p/3221344.html

你可能感兴趣的文章
数据库多张表导出到excel
查看>>
微信小程序去除button默认样式
查看>>
Where does Visual Studio look for C++ Header files?
查看>>
Java打包可执行jar包 包含外部文件
查看>>
Docker容器运行ASP.NET Core
查看>>
Windows Phone开发(37):动画之ColorAnimation
查看>>
DevExpress的Web控件汉化方法
查看>>
js中escape,encodeURI,encodeURIComponent 区别(转)
查看>>
Android studio怎么修改文件名
查看>>
sass学习笔记-安装
查看>>
多缓存并存
查看>>
Flask (二) cookie 与 session 模型
查看>>
修改添加网址的教程文件名
查看>>
hdu 1045:Fire Net(DFS经典题)
查看>>
[BZOJ 1017][JSOI2008]魔兽地图DotR(树形Dp)
查看>>
裁剪图片
查看>>
数据结构实习 problem L 由二叉树的中序层序重建二叉树
查看>>
VS中展开和折叠代码
查看>>
如何确定VS编译器版本
查看>>
设置PL/SQL 快捷键
查看>>