演示效果如下

演示工程,全部就一个文件,代码如下

unit Frm_Main;

interface

uses
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
System.Rtti,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
qstring,
QPlugins,
qplugins_base,
qplugins_params,
Vcl.ExtCtrls; type
TForm_Main = class(TForm)
Panel1: TPanel;
Button1: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end; // 继承自TQService服务
TIntAddService = class(TQService)
public
function Execute(AParams: IQParams; AResult: IQParams): Boolean; override; stdcall;
end; // 继承自TQService服务
TFloatAddService = class(TQService)
public
function Execute(AParams: IQParams; AResult: IQParams): Boolean; override; stdcall;
end; var
Form_Main: TForm_Main; implementation {$R *.dfm} // 判断参数类型
function IsIntType(AType: TQParamType): Boolean;
begin
Result := AType in [ptInt8, ptInt16, ptInt32, ptInt64, ptUInt8, ptUInt16,
ptUInt32, ptUInt64];
end; // 判断参数类型
function IsFloatType(AType: TQParamType): Boolean;
begin
Result := AType in [ptFloat4, ptFloat8];
end;
{TFloatAddService} function TFloatAddService.Execute(AParams, AResult: IQParams): Boolean;
begin
// 判断参数类型都是浮点型
if IsFloatType(AParams[].ParamType) and IsFloatType(AParams[].ParamType)
then
begin
// 两个参数相加
AResult.Add('Result', ptFloat8).AsFloat := AParams[].AsFloat +
AParams[].AsFloat;
Result := True;
end
else
Result := False;
end;
{TIntAddService} function TIntAddService.Execute(AParams, AResult: IQParams): Boolean;
begin
// 判断参数类型都是整数型
if IsIntType(AParams[].ParamType) and IsIntType(AParams[].ParamType) then
begin
// 两个参数相加
AResult.Add('Result', ptInt64).AsInt64 := AParams[].AsInt64 +
AParams[].AsInt64;
Result := True;
end
else
begin
Result := False;
end;
end; procedure TForm_Main.Button1Click(Sender: TObject);
var
AServices: IQServices;
AParams, AResult: IQParams;
procedure Calc;
var
I: Integer;
begin
// 注册2个服务,名字分别为TIntAddService和TFloatAddService
for I := to AServices.Count - do
begin
if AServices[I].Execute(AParams, AResult) then
begin
Memo1.Lines.Add('通过服务 ' + AServices[I].Name + ' 计算完成。');
Break;
end;
end;
end; begin
// 创建2个参数
AParams := TQParams.Create;
AResult := TQParams.Create;
// 调用两个整数型相加
AServices := PluginsManager.ByPath('Services/Adds') as IQServices;
AParams.Add('X', ptUInt8).AsInteger := ;
AParams.Add('Y', ptUInt8).AsInteger := ;
Calc;
Memo1.Lines.Add(' 计算表达式 100+200=' + IntToStr(AResult[].AsInt64));
AParams.Clear;
AResult.Clear;
// 调用两个浮点型相加
AParams.Add('X', ptFloat8).AsFloat := 100.3;
AParams.Add('Y', ptFloat8).AsFloat := 20.05;
Calc;
Memo1.Lines.Add(' 计算表达式 100.3+20.05=' + FloatToStr(AResult[].AsFloat));
end; // 创建
procedure TForm_Main.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := True;
// 注册2个服务,名字分别为TIntAddService和TFloatAddService
RegisterServices('/Services/Adds', [TIntAddService.Create(NewId, 'AddInt'), TFloatAddService.Create
(NewId, 'AddFloat')]);
end; end.

006.Delphi插件之QPlugins,多服务演示的更多相关文章

  1. 009.Delphi插件之QPlugins,服务的热插拔

    这个DEMO用来演示服务的替换,用起来总是怪怪的感觉,效果图如下 代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, ...

  2. 008.Delphi插件之QPlugins,服务的两种调用方法

    这个QPlugins自带的DEMO,大概的意思就是,创建2个服务类,程序启动的时候注册这2个服务类.点击不同的按钮,使用不同的方法来调用这个服务. 效果界面如下 unit Frm_Main; inte ...

  3. 010.Delphi插件之QPlugins,遍历服务接口

    这个DEMO注意是用来看一个DLL所拥有的全部服务接口 演示效果如下 代码如下: unit Frm_Main; interface uses Winapi.Windows, Winapi.Messag ...

  4. 012.Delphi插件之QPlugins,多实例内嵌窗口服务

    这个DEMO中主要是在DLL中建立了一个IDockableControl类,并在DLL的子类中写了具体的实现方法. 在主程序exe中,找到这个服务,然后调用DLL的内嵌方法,把DLL插件窗口内嵌到主程 ...

  5. 011.Delphi插件之QPlugins,延时加载服务

    这个DEMO是是把DLL插件的相关信息做成了一个配置文件,主程序加载这个配置文件,从而起到延时加载的作用 主程序代码如下 unit Frm_Main; interface uses Winapi.Wi ...

  6. 013.Delphi插件之QPlugins,模块化代码示例

    这个DEMO的是一个定义了一个窗体插件接口,把其他窗口注册到这个窗体插件接口中.主程序运行起来,就遍历一下窗体插件接口,把每个窗体内嵌到对话框中 运行效果如下 主窗口代码如下 unit Frm_Mai ...

  7. 005.Delphi插件之QPlugins,IQNotify通知

    演示的界面如下,拖动滚动条,百分比圆和进度条也是会跟着动的 主程序的代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages ...

  8. 004.Delphi插件之QPlugins,参数传递

    界面如下 插件框架中大量使用了接口的东西,看的眼花缭乱,很多地方只做了申明,具体的实现是在另外的子类. DLL的代码如下 unit ParamTest; interface uses classes, ...

  9. 015.Delphi插件之QPlugins,FMX插件窗口

    内嵌FMX的插件窗口,效果还是很可以的.退出时,会报错,很诡异啊. 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messa ...

随机推荐

  1. python中 yield 的用法 (简单、清晰)

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...

  2. gitignore文件简单编写规则

    一.生成.gitignore文件 1.进入项目根目录,打开终端: 2.输入 vi .gitignore 创建并打开隐藏文件.gitignore: 二 . 设置要忽略上传的文件或文件夹 1.过滤整个文件 ...

  3. 寒假作业---蓝桥杯---DFS

    题目描述 现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: 每个方块代表1~13中的某一个数字,但不能重复. 比如: 6  + 7 = 13 9  - 8 = 1 3  * 4 = 12 10 ...

  4. Pytorch本人疑问(1) torch.nn和torch.nn.functional之间的区别

    在写代码时发现我们在定义Model时,有两种定义方法: torch.nn.Conv2d()和torch.nn.functional.conv2d() 那么这两种方法到底有什么区别呢,我们通过下述代码看 ...

  5. python爬虫(四) 内涵段子

    import requests import time import json from urllib import request from urllib import parse url = 'h ...

  6. Linux centosVMware shell中的函数、shell中的数组、

    一.shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function _name() { command ...

  7. a链接 打电话 发短信 发email

    <a href="tel:10086">给10086打电话</a><a href="sms:10086">给10086发短信 ...

  8. 「BJOI2018」求和

    「BJOI2018」求和 传送门 观察到 \(k\) 很小而且模数不会变,所以我们直接预处理 \(k\) 取所有值时树上前缀答案,查询的时候差分一下即可. 参考代码: #include <alg ...

  9. Linux/CentOS环境下如何安装和配置PhantomJS工作环境

    PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, C ...

  10. JS array delete splice 区别

    Delete in this case will only set the element as undefined: > myArray =['a','b','c','d'] >dele ...