DELPHI RTTI实现非可视的功能插件
思路:通过数据字典定义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实现非可视的功能插件的更多相关文章
- Delphi 各版本新特性功能网址收集
Delphi XE2 三个新功能介绍举例_西西软件资讯 http://www.cr173.com/html/13179_1.html delphi 2007新功能简介-davidxueer-Chin ...
- js-分享功能插件
soshm 分享功能插件 地市:https://github.com/calledT/soshm yarn 安装:yarn add soshm -s; 引入:import soshm from ‘s ...
- delphi RTTI 四 获取类属性列表
delphi RTTI 四 获取类属性列表 GetPropList(btn1.ClassInfo, tkAny, PropList) PropCount := GetTypeData(btn1.Cla ...
- delphi RTTI 三 属性读取与赋值
delphi RTTI 读取属性 运行期 通过RTTI给属性赋值 http://docwiki.embarcadero.com/CodeExamples/Berlin/en/Event_RTTI_In ...
- Delphi XE2有什么新功能
具体内容见PDF Delphi XE2有什么新功能Delphi XE2提供(offers)了令人兴奋(exciting)的新功能,让您能够建立高度可视化的,在Windows,Mac和iOS上的业务应用 ...
- 有关Delphi RTTI的一些文章
Delphi RTTI 资料 Delphi 的RTTI机制浅探 Delphi XE的RTTI增强,动态Hook某些内部事件
- Vue项目功能插件
项目功能插件 vue-router { path: '/', name: 'home', // 路由的重定向 redirect: '/home' } { // 一级路由, 在根组件中被渲染, 替换根组 ...
- dt7.0自定义推送熊掌号功能插件
因要推送较早的数据,所以写了一个自定义推送熊掌号的功能插件,因我自己站点是新站,推送的数据较少,所以程序比较简单,算是初始版本,凑合着用吧. <?php /* 百度当天主动推送熊掌功能 作者:6 ...
- 强大的DELPHI RTTI–兼谈需要了解多种开发语言
一月 27th, 2005 by 猛禽 风焱在<“18般武艺”?>中说到他碰上的被多种语言纠缠的问题.我在回复里说: 很多语言只要能看懂几分就行了,没必要每一种都精通 但是如果只会很少的一 ...
随机推荐
- c++小游戏
#include <iostream> using namespace std; double shengmingli=2000;//定义主角初始生命力 int gongjili=150; ...
- Log4J2的 PatternLayout
Log4J2 PatternLayout 参考 日志样例 : 2018-10-21 07:30:05,184 INFO - DeviceChannelServiceImpl.java:434[defa ...
- Java多线程——线程八锁案例分析
Java多线程——线程八锁案例分析 摘要:本文主要学习了多线程并发中的一些案例. 部分内容来自以下博客: https://blog.csdn.net/dyt443733328/article/deta ...
- css每次的初始化代码
;;} body{font-size:14px;} img{border:none;} li{list-style:none;} input,select,textarea{outline:none; ...
- nc的简单使用
1.传输文件: 目的主机监听 nc -l 监听端口<未使用端口> > 要接收的文件名 nc -l 6666 > filename.tar 源主机发起请求 nc 目的主机ip ...
- java 类名.this
类名为this的限定词. 相对于内部类:有多个this: 1.内部类本身的this: 2.内部类的环境类的this: 类名.this,就是为了对这些this指针的指向做出限定. 区别于类名.class ...
- 字符串str
字符串: #字符串的索引从0开始的,如果倒数最后一位是-1,索引的位置是唯一的.var1 = var[0:2] #从第一个字符到第2个字符var2 = var[:] #从第一个到最后var3 = va ...
- 一文详解Spring Cloud Feign重试机制
前言 Feign组件默认使用Ribbon的重试机制并增加了根据状态码判断重试机制,默认情况下是不启用的.Feign使用的是Spring Retry组件,需要引入依赖才能启用. 一.POM引入Sprin ...
- C++ Primer(第4版)-学习笔记-第1部分:基本语言
第1章 快速入门 每个C++程序都包含一个或多个函数,而且必须有一个命名为main. main函数是唯一被操作系统显式调用的函数,main函数的返回值必须是int或者void(无返回值) 函数体是函 ...
- 2018.03.04 晚上Atcoder比赛
C - March Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement There are N ...