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 ...
随机推荐
- 阿里云Centos7安装mysql5.7
下载mysql安装包 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 安装mysql yum -y ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:引导主体副本
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 显示代码:电脑程序输出: Sample output
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- BurpSuite pro v2.0.11版
下载地址: 链接:https://pan.baidu.com/s/1CgXgK_lV2OWjRT364hvfog 提取码:gvxy BurpSuite介绍 借用一下吾爱破解文章中的描述信息:https ...
- oracle SQL 练习
COURSE 表 DROP TABLE "SCOTT"."course"; CREATE TABLE "SCOTT"."cours ...
- java 8时间使用LocalDateTime,ZonedDateTime,LocalDate
前言 java 8的时间已经能够满足日常的使用,也方便理解.joda-time作为一个有优秀的时间组件也不得不告知使用者在java 8以后使用自带的时间 LocalDateTime以及ZonedDat ...
- JSTL中获取URL参数
使用JSTL时,URL会被隐含的对象param包裹起来,使用param.变量名,直接获取值 <body>hello:${param.name}</body> 依据此逻辑,在使用 ...
- 利用Session实现三天免登陆
什么是Session Session:在计算机中,尤其是在网络应用中,称为“会话控制”.(百度百科) Session:服务器端的数据存储技术. Session要解决什么问题 一个用户的不同请求(重定位 ...
- JS垂直落体回弹原理
/* *JS垂直落体回弹原理 */ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- C++11并发编程1------并发介绍
也许有人会觉得多线程和并发难用,复杂,还会让代码出现各种各样的问题,不过,其实它是一个强有力的工具,能让程序充分利用硬件资源,让程序运行得更快. 何谓并发: 两个或更多独立得活动同时发生.计算机中就是 ...