013.Delphi插件之QPlugins,模块化代码示例
这个DEMO的是一个定义了一个窗体插件接口,把其他窗口注册到这个窗体插件接口中。主程序运行起来,就遍历一下窗体插件接口,把每个窗体内嵌到对话框中
运行效果如下
主窗口代码如下
- unit Frm_Main;
- interface
- {
- 本程序演示了如何使用QPlugins来做模块间的松散耦合,使用了Execute来传递,实际上
- 也可以约定接口直接调用(请参考 MultiInstance 示例)
- }
- uses
- Winapi.Windows,
- Winapi.Messages,
- System.SysUtils,
- System.Variants,
- System.Classes,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- QPlugins,
- qplugins_base,
- qplugins_params,
- Vcl.StdCtrls,
- Vcl.ComCtrls;
- type
- TForm_Main = class(TForm)
- PageControl1: TPageControl;
- procedure FormCreate(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form_Main: TForm_Main;
- implementation
- {$R *.dfm}
- // 创建主窗口
- procedure TForm_Main.FormCreate(Sender: TObject);
- var
- ARoot: IQServices;
- I: Integer;
- ATabSheet: TTabSheet;
- AParams: IQParams;
- begin
- // 通过路径获取指定的服务接口实例
- ARoot := PluginsManager.ByPath('Services/Docks') as IQServices;
- // 如果存在
- if Assigned(ARoot) then
- begin
- // 创建参数
- AParams := TQParams.Create;
- AParams.Add('Parent', ptUInt64);
- // 遍历实例
- for I := to ARoot.Count - do
- begin
- // 每个实例都创建一个内嵌窗体
- ATabSheet := TTabSheet.Create(PageControl1);
- ATabSheet.PageControl := PageControl1;
- ATabSheet.Caption := ARoot[I].Name;
- //
- AParams[].AsInt64 := IntPtr(ATabSheet);
- ARoot[I].Execute(AParams, nil);
- end;
- end;
- end;
- end.
服务单元如下
- unit Serv_Dock;
- interface
- uses
- classes,
- qstring,
- QPlugins,
- qplugins_params,
- qplugins_base,
- controls;
- type
- TDockService = class(TQService)
- private
- FControlClass: TControlClass;
- public
- function Execute(AParams: IQParams; AResult: IQParams): Boolean; override; stdcall;
- property ControlClass: TControlClass read FControlClass write FControlClass;
- end;
- const
- // 窗口插件接口
- IDockServices: TGUID = '{9DDD6DD9-3053-4EE2-90D5-759267DBB10C}';
- // 注册插件窗体
- procedure RegisterDock(AClass: TControlClass);
- implementation
- { TDockService }
- // 执行服务并将结果返回到AResult中
- function TDockService.Execute(AParams, AResult: IQParams): Boolean;
- var
- AParent: TWinControl;
- AControl: TControl;
- begin
- // 第一个参数为父窗口句柄
- AParent := Pointer(AParams[].AsInt64);
- // 窗体内嵌,并返回真
- AControl := ControlClass.Create(AParent);
- AControl.HostDockSite := AParent;
- AControl.Visible := True;
- AControl.Align := alClient;
- Result := True;
- end;
- // 注册插件窗体
- procedure RegisterDock(AClass: TControlClass);
- var
- AParent: IQServices;
- AService: TDockService;
- begin
- // ById通过服务接口ID获取服务接口实例,唯一的IDockServices
- AParent := PluginsManager.ById(IDockServices) as IQServices;
- // 创建TDockService服务
- AService := TDockService.Create(NewId, AClass.ClassName);
- AService.ControlClass := AClass;
- // 把服务添加到服务接口实例中
- AParent.Add(AService);
- end;
- procedure RegisterClass;
- begin
- // 注册内嵌窗体接口
- PluginsManager.Services.Add(TQServices.Create(IDockServices, 'Docks'));
- end;
- initialization
- // 注册
- RegisterClass;
- end.
窗体1
- unit Frm_Show1;
- interface
- uses
- Winapi.Windows,
- Winapi.Messages,
- System.SysUtils,
- System.Variants,
- System.Classes,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.StdCtrls,
- Vcl.ExtCtrls;
- type
- TForm_Show1 = class(TForm)
- Panel1: TPanel;
- Memo1: TMemo;
- Label1: TLabel;
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form_Show1: TForm_Show1;
- implementation
- uses
- Serv_Dock;
- {$R *.dfm}
- initialization
- // ById通过服务接口ID获取IDockServices服务接口实例,并把这个TForm_Show1注册到接口实例中
- RegisterDock(TForm_Show1);
- end.
窗体2
- unit Frm_Show2;
- interface
- uses
- Winapi.Windows,
- Winapi.Messages,
- System.SysUtils,
- System.Variants,
- System.Classes,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.StdCtrls,
- Vcl.ExtCtrls,
- Vcl.Imaging.jpeg;
- type
- TForm_Show2 = class(TForm)
- Panel1: TPanel;
- Label1: TLabel;
- Image1: TImage;
- Label2: TLabel;
- Label3: TLabel;
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form_Show2: TForm_Show2;
- implementation
- uses
- Serv_Dock;
- {$R *.dfm}
- initialization
- // ById通过服务接口ID获取IDockServices服务接口实例,并把这个TForm_Show2注册到接口实例中
- RegisterDock(TForm_Show2);
- end.
013.Delphi插件之QPlugins,模块化代码示例的更多相关文章
- 基于RabbltMQ延迟插件实现延迟队列代码示例
上一篇文章写了docker安装RabbitMQ及延迟插件的安装,这篇的话是基于RabbitMQ延迟插件实现延迟队列的示例 那么废话不多说 直接上代码!! 首先创建延迟队列配置类 DelayedQueu ...
- 015.Delphi插件之QPlugins,FMX插件窗口
内嵌FMX的插件窗口,效果还是很可以的.退出时,会报错,很诡异啊. 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messa ...
- 014.Delphi插件之QPlugins,MDI窗口
不知道为什么,这个DEMO编译出来报错,运行不了,在QDAC群里问了一下也没人响应. 效果如下 主程序代码如下 unit Frm_Main; interface uses Winapi.Windows ...
- 012.Delphi插件之QPlugins,多实例内嵌窗口服务
这个DEMO中主要是在DLL中建立了一个IDockableControl类,并在DLL的子类中写了具体的实现方法. 在主程序exe中,找到这个服务,然后调用DLL的内嵌方法,把DLL插件窗口内嵌到主程 ...
- 011.Delphi插件之QPlugins,延时加载服务
这个DEMO是是把DLL插件的相关信息做成了一个配置文件,主程序加载这个配置文件,从而起到延时加载的作用 主程序代码如下 unit Frm_Main; interface uses Winapi.Wi ...
- 010.Delphi插件之QPlugins,遍历服务接口
这个DEMO注意是用来看一个DLL所拥有的全部服务接口 演示效果如下 代码如下: unit Frm_Main; interface uses Winapi.Windows, Winapi.Messag ...
- 009.Delphi插件之QPlugins,服务的热插拔
这个DEMO用来演示服务的替换,用起来总是怪怪的感觉,效果图如下 代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, ...
- 007.Delphi插件之QPlugins,插件的卸载和重新加载
效果图如下,可以反复卸载和重新加载.QPlugins这个插件,还没弄明白,摸索着跟着DEMO写 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows ...
- 005.Delphi插件之QPlugins,IQNotify通知
演示的界面如下,拖动滚动条,百分比圆和进度条也是会跟着动的 主程序的代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages ...
随机推荐
- CCF认证201909-4推荐系统
#include <iostream> #include <list> #include <set> #include <vector> using n ...
- PostgreSQL存取jsonb
从PostgreSQL 9.3开始,json就成了postgres里的一种数据类型,也就是和varchar.int一样,我们表里的一个字段的类型可以为json了. 与此同时,postgres还提供了j ...
- 技术|Android安装包极限优化
版权声明 1.本文版权归原作者所有,转载需注明作者信息及原文出处. 2.本文作者:赵裕(vimerzhao),永久链接:https://github.com/vimerzhao/vimerzhao.g ...
- C/C++网络编程2——socket函数
本节主要介绍创建套接字的socket函数. #include <sys/socket.h> int socket(int domain, int type, int protocol); ...
- 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)
PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...
- Pandas 用法汇总
一.生成数据表 1.首先导入pandas 库,一般会用到 numpy 库,所以我们先导入备用: import numpy as np import pandas as pd 2.生成 CSV 或者 x ...
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵
想了挺久没想出来,一看题解恍然大悟.一个数对应一行和一列,二分答案,凡是小于等于答案的就连边.如果满足能够取出 \(n - k + 1\) 个不比二分中点 \(mid\) 大的数,那么r = mid, ...
- Linux之系统优化配置
Linux系统优化配置 更新国内镜像源 国内速度快的常用更新源如下: http://mirrors.sohu.com http://mirrors.163.com [root@greymous ...
- 百度统计数据导出demo的坑
1.用户名中文的问题 由于demo文件格式的问题,如果用户名使用中文的话,会出现一下问题 ----------------------preLogin---------------------- [ ...
- 第一章、ssh安装及远程登入配置
1.Ubuntu下 确认 SSH Server 是否启动 输入: sudo ps -e | grep ssh. 如果正确启动, 命令行中会显示sshd. 安装服务端 OpenSSH Server 输入 ...