思路:通过数据字典定义BPL包名,然后定义BPL包里面的类名,然后定义类里面的方法名,最后定义方法的参数值。

可实现动态加载BPL,调用哪个BPL的哪个类的哪个方法并给该方法赋给指定的参数值,如果是函数还可以取得函数的返回值。

应用场合之一:中间件实现非可视功能插件。

下面来DEMO码子。

首先动态加载BPL包:

bplName := TPlug(TdxBarButton(Sender).Tag).bplName;
  if FileExists(bplName) then
  begin
    unitClass := string(TPlug(TdxBarButton(Sender).Tag).UnitCalss);
    plugName := TPlug(TdxBarButton(Sender).Tag).description;
    powerValue := TPlug(TdxBarButton(Sender).Tag).powerValue;
    if not bplList.ContainsKey(bplName) then
    begin
      h := LoadPackage(bplName);
      if h = 0 then
        ShowTrayHint(bplName + '包加载失败')
      else
        bplList.Add(bplName, h);
    end;

然后获取BPL的对象

var
  LContext: TRttiContext;
  LPackage: TRttiPackage;
  LClass: TRttiInstanceType;
  aForm: TCustomForm;

begin

LContext := TRttiContext.Create;
    try
      for LPackage in LContext.GetPackages() do
      begin
        if SameText(ExtractFileName(LPackage.Name), bplFile) then
        begin

LClass := LPackage.FindType(unitClass) as TRttiInstanceType;
          aForm := LClass.MetaclassType.Create as TCustomForm;

end

finally
      LContext.Free;
    end;

最后传递参数调用类的方法

TMyClass = class(TComponent)
  public
    procedure msg(const str: string);
    function Add(const a,b: Integer): Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyClass }

procedure TMyClass.msg(const str: string);
begin
  MessageDlg(str, mtInformation, [mbYes], 0);
end;

function TMyClass.Add(const a, b: Integer): Integer;
begin
  Result := a + b;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  obj: TMyClass;
  t: TRttiType;
  m1,m2: TRttiMethod;
  r: TValue; //TRttiMethod.Invoke 的返回类型
begin
  t := TRttiContext.Create.GetType(TMyClass);

{获取 TMyClass 类的两个方法}
  m1 := t.GetMethod('msg'); {procedure}
  m2 := t.GetMethod('Add'); {function}

obj := TMyClass.Create(Self); {调用需要依赖一个已存在的对象}

{调用 msg 过程}
  m1.Invoke(obj, ['Delphi 2010']); {将弹出信息框}

{调用 Add 函数}
  r := m2.Invoke(obj, [1, 2]); {其返回值是个 TValue 类型的结构}
  ShowMessage(IntToStr(r.AsInteger)); {3}

obj.Free;
end;

代码只是为了演示这么个意思,你懂的。

以上的一切都是通过字典定义,RTTI运行时根据字典动态调用,如果你的开发框架里面或者中间件里面这样实现,简直帅呆了!

DELPHI RTTI实现非可视的功能插件的更多相关文章

  1. Delphi 各版本新特性功能网址收集

    Delphi XE2 三个新功能介绍举例_西西软件资讯  http://www.cr173.com/html/13179_1.html delphi 2007新功能简介-davidxueer-Chin ...

  2. js-分享功能插件

    soshm 分享功能插件 地市:https://github.com/calledT/soshm yarn 安装:yarn add soshm -s;  引入:import soshm from ‘s ...

  3. delphi RTTI 四 获取类属性列表

    delphi RTTI 四 获取类属性列表 GetPropList(btn1.ClassInfo, tkAny, PropList) PropCount := GetTypeData(btn1.Cla ...

  4. delphi RTTI 三 属性读取与赋值

    delphi RTTI 读取属性 运行期 通过RTTI给属性赋值 http://docwiki.embarcadero.com/CodeExamples/Berlin/en/Event_RTTI_In ...

  5. Delphi XE2有什么新功能

    具体内容见PDF Delphi XE2有什么新功能Delphi XE2提供(offers)了令人兴奋(exciting)的新功能,让您能够建立高度可视化的,在Windows,Mac和iOS上的业务应用 ...

  6. 有关Delphi RTTI的一些文章

    Delphi RTTI 资料 Delphi 的RTTI机制浅探 Delphi XE的RTTI增强,动态Hook某些内部事件

  7. Vue项目功能插件

    项目功能插件 vue-router { path: '/', name: 'home', // 路由的重定向 redirect: '/home' } { // 一级路由, 在根组件中被渲染, 替换根组 ...

  8. dt7.0自定义推送熊掌号功能插件

    因要推送较早的数据,所以写了一个自定义推送熊掌号的功能插件,因我自己站点是新站,推送的数据较少,所以程序比较简单,算是初始版本,凑合着用吧. <?php /* 百度当天主动推送熊掌功能 作者:6 ...

  9. 强大的DELPHI RTTI–兼谈需要了解多种开发语言

    一月 27th, 2005 by 猛禽 风焱在<“18般武艺”?>中说到他碰上的被多种语言纠缠的问题.我在回复里说: 很多语言只要能看懂几分就行了,没必要每一种都精通 但是如果只会很少的一 ...

随机推荐

  1. [App Store Connect帮助]三、管理 App 和版本(3)查找 App

    在“我的 App”中,使用工具栏控件快速查找 App. 搜索 App: 在搜索栏中输入文本. 您可以输入 App 的名称.Apple ID(App 标识符).套装 ID,或 SKU.套装 ID 和 S ...

  2. $CF1141B Maximal Continuous Rest$

    告诉你一天n件事情 a[i]为1是休息 a[i]为2是工作 求最长连续的休息时间(即最长的1 可以作为环状来求.(即环状最长的1 这题就可以用前缀和贪心等什么操作.. 然后用\(ans1ans2\)瞎 ...

  3. Codeforces 792D

    题意:给定一棵拥有n个节点的满二叉树(即n==2^x-1),q个查询,每次给出一个节点的编号,再给出一个由L,R,U组成的字符串序列,依次表示向左子节点.右子节点.父节点移动,如果移动不合法,则忽略. ...

  4. myeclipse配置tomcat后,无法正常使用的问题

    如图所示:一定要设置为Enable.否则部署tomcat时,没有tomcat8.0

  5. java环境搭建(及安装问题“No repository found containing”解决) 并创立第一个java程序

    环境: java8 及 Eclipse java8 配置:http://jingyan.baidu.com/article/e2284b2b5967e7e2e7118d74.html Eclipse ...

  6. Android 微信SDK图片分享(checkArgs fail, thumbData is invalid)

    微信官网给的Demo中.图片的分享例子他是这么描述的: String url = "http://pic2.nipic.com/20090506/1478953_125254084_2.jp ...

  7. 图解TCP/IP笔记(1)——TCP/IP协议群

    转载请注明:https://www.cnblogs.com/igoslly/p/9167916.html TCP/IP制定  制定:IETF 记录:RFC - Request for comment ...

  8. PDO访问其他数据库操作及作用

    PDO的作用 PDO<!--数据访问抽象层--><!--1.可以访问其他数据库--><!--2.具有事务功能--><!--3.带有预处理语句功能(防止SQL注 ...

  9. mybatis 简单的入门实例

    第一步:添加mybaties的架包 第二步:配置mybaties的文件 <?xml version="1.0" encoding="UTF-8" ?> ...

  10. jquery 实现 单选框点击取消

    <label for="1" class="z-label"> <input type="radio" class=&qu ...