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

运行效果如下

主窗口代码如下

  1. unit Frm_Main;
  2.  
  3. interface
  4.  
  5. {
  6. 本程序演示了如何使用QPlugins来做模块间的松散耦合,使用了Execute来传递,实际上
  7. 也可以约定接口直接调用(请参考 MultiInstance 示例)
  8. }
  9. uses
  10. Winapi.Windows,
  11. Winapi.Messages,
  12. System.SysUtils,
  13. System.Variants,
  14. System.Classes,
  15. Vcl.Graphics,
  16. Vcl.Controls,
  17. Vcl.Forms,
  18. Vcl.Dialogs,
  19. QPlugins,
  20. qplugins_base,
  21. qplugins_params,
  22. Vcl.StdCtrls,
  23. Vcl.ComCtrls;
  24.  
  25. type
  26. TForm_Main = class(TForm)
  27. PageControl1: TPageControl;
  28. procedure FormCreate(Sender: TObject);
  29. private
  30. { Private declarations }
  31. public
  32. { Public declarations }
  33. end;
  34.  
  35. var
  36. Form_Main: TForm_Main;
  37.  
  38. implementation
  39.  
  40. {$R *.dfm}
  41.  
  42. // 创建主窗口
  43. procedure TForm_Main.FormCreate(Sender: TObject);
  44. var
  45. ARoot: IQServices;
  46. I: Integer;
  47. ATabSheet: TTabSheet;
  48. AParams: IQParams;
  49. begin
  50. // 通过路径获取指定的服务接口实例
  51. ARoot := PluginsManager.ByPath('Services/Docks') as IQServices;
  52. // 如果存在
  53. if Assigned(ARoot) then
  54. begin
  55. // 创建参数
  56. AParams := TQParams.Create;
  57. AParams.Add('Parent', ptUInt64);
  58. // 遍历实例
  59. for I := to ARoot.Count - do
  60. begin
  61. // 每个实例都创建一个内嵌窗体
  62. ATabSheet := TTabSheet.Create(PageControl1);
  63. ATabSheet.PageControl := PageControl1;
  64. ATabSheet.Caption := ARoot[I].Name;
  65. //
  66. AParams[].AsInt64 := IntPtr(ATabSheet);
  67. ARoot[I].Execute(AParams, nil);
  68. end;
  69. end;
  70. end;
  71.  
  72. end.

服务单元如下

  1. unit Serv_Dock;
  2.  
  3. interface
  4.  
  5. uses
  6. classes,
  7. qstring,
  8. QPlugins,
  9. qplugins_params,
  10. qplugins_base,
  11. controls;
  12.  
  13. type
  14. TDockService = class(TQService)
  15. private
  16. FControlClass: TControlClass;
  17. public
  18. function Execute(AParams: IQParams; AResult: IQParams): Boolean; override; stdcall;
  19. property ControlClass: TControlClass read FControlClass write FControlClass;
  20. end;
  21.  
  22. const
  23. // 窗口插件接口
  24. IDockServices: TGUID = '{9DDD6DD9-3053-4EE2-90D5-759267DBB10C}';
  25.  
  26. // 注册插件窗体
  27. procedure RegisterDock(AClass: TControlClass);
  28.  
  29. implementation
  30.  
  31. { TDockService }
  32.  
  33. // 执行服务并将结果返回到AResult中
  34. function TDockService.Execute(AParams, AResult: IQParams): Boolean;
  35. var
  36. AParent: TWinControl;
  37. AControl: TControl;
  38. begin
  39. // 第一个参数为父窗口句柄
  40. AParent := Pointer(AParams[].AsInt64);
  41. // 窗体内嵌,并返回真
  42. AControl := ControlClass.Create(AParent);
  43. AControl.HostDockSite := AParent;
  44. AControl.Visible := True;
  45. AControl.Align := alClient;
  46. Result := True;
  47. end;
  48.  
  49. // 注册插件窗体
  50. procedure RegisterDock(AClass: TControlClass);
  51. var
  52. AParent: IQServices;
  53. AService: TDockService;
  54. begin
  55. // ById通过服务接口ID获取服务接口实例,唯一的IDockServices
  56. AParent := PluginsManager.ById(IDockServices) as IQServices;
  57. // 创建TDockService服务
  58. AService := TDockService.Create(NewId, AClass.ClassName);
  59. AService.ControlClass := AClass;
  60. // 把服务添加到服务接口实例中
  61. AParent.Add(AService);
  62. end;
  63.  
  64. procedure RegisterClass;
  65. begin
  66. // 注册内嵌窗体接口
  67. PluginsManager.Services.Add(TQServices.Create(IDockServices, 'Docks'));
  68. end;
  69.  
  70. initialization
  71.  
  72. // 注册
  73. RegisterClass;
  74.  
  75. end.

窗体1

  1. unit Frm_Show1;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows,
  7. Winapi.Messages,
  8. System.SysUtils,
  9. System.Variants,
  10. System.Classes,
  11. Vcl.Graphics,
  12. Vcl.Controls,
  13. Vcl.Forms,
  14. Vcl.Dialogs,
  15. Vcl.StdCtrls,
  16. Vcl.ExtCtrls;
  17.  
  18. type
  19. TForm_Show1 = class(TForm)
  20. Panel1: TPanel;
  21. Memo1: TMemo;
  22. Label1: TLabel;
  23. private
  24. { Private declarations }
  25. public
  26. { Public declarations }
  27. end;
  28.  
  29. var
  30. Form_Show1: TForm_Show1;
  31.  
  32. implementation
  33.  
  34. uses
  35. Serv_Dock;
  36. {$R *.dfm}
  37.  
  38. initialization
  39.  
  40. // ById通过服务接口ID获取IDockServices服务接口实例,并把这个TForm_Show1注册到接口实例中
  41. RegisterDock(TForm_Show1);
  42.  
  43. end.

窗体2

  1. unit Frm_Show2;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows,
  7. Winapi.Messages,
  8. System.SysUtils,
  9. System.Variants,
  10. System.Classes,
  11. Vcl.Graphics,
  12. Vcl.Controls,
  13. Vcl.Forms,
  14. Vcl.Dialogs,
  15. Vcl.StdCtrls,
  16. Vcl.ExtCtrls,
  17. Vcl.Imaging.jpeg;
  18.  
  19. type
  20. TForm_Show2 = class(TForm)
  21. Panel1: TPanel;
  22. Label1: TLabel;
  23. Image1: TImage;
  24. Label2: TLabel;
  25. Label3: TLabel;
  26. private
  27. { Private declarations }
  28. public
  29. { Public declarations }
  30. end;
  31.  
  32. var
  33. Form_Show2: TForm_Show2;
  34.  
  35. implementation
  36.  
  37. uses
  38. Serv_Dock;
  39. {$R *.dfm}
  40.  
  41. initialization
  42.  
  43. // ById通过服务接口ID获取IDockServices服务接口实例,并把这个TForm_Show2注册到接口实例中
  44. RegisterDock(TForm_Show2);
  45.  
  46. end.

013.Delphi插件之QPlugins,模块化代码示例的更多相关文章

  1. 基于RabbltMQ延迟插件实现延迟队列代码示例

    上一篇文章写了docker安装RabbitMQ及延迟插件的安装,这篇的话是基于RabbitMQ延迟插件实现延迟队列的示例 那么废话不多说 直接上代码!! 首先创建延迟队列配置类 DelayedQueu ...

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

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

  3. 014.Delphi插件之QPlugins,MDI窗口

    不知道为什么,这个DEMO编译出来报错,运行不了,在QDAC群里问了一下也没人响应. 效果如下 主程序代码如下 unit Frm_Main; interface uses Winapi.Windows ...

  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. 010.Delphi插件之QPlugins,遍历服务接口

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

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

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

  8. 007.Delphi插件之QPlugins,插件的卸载和重新加载

    效果图如下,可以反复卸载和重新加载.QPlugins这个插件,还没弄明白,摸索着跟着DEMO写 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows ...

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

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

随机推荐

  1. CCF认证201909-4推荐系统

    #include <iostream> #include <list> #include <set> #include <vector> using n ...

  2. PostgreSQL存取jsonb

    从PostgreSQL 9.3开始,json就成了postgres里的一种数据类型,也就是和varchar.int一样,我们表里的一个字段的类型可以为json了. 与此同时,postgres还提供了j ...

  3. 技术|Android安装包极限优化

    版权声明 1.本文版权归原作者所有,转载需注明作者信息及原文出处. 2.本文作者:赵裕(vimerzhao),永久链接:https://github.com/vimerzhao/vimerzhao.g ...

  4. C/C++网络编程2——socket函数

    本节主要介绍创建套接字的socket函数. #include <sys/socket.h> int socket(int domain, int type, int protocol); ...

  5. 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)

    PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...

  6. Pandas 用法汇总

    一.生成数据表 1.首先导入pandas 库,一般会用到 numpy 库,所以我们先导入备用: import numpy as np import pandas as pd 2.生成 CSV 或者 x ...

  7. LibreOJ #2006. 「SCOI2015」小凸玩矩阵

    想了挺久没想出来,一看题解恍然大悟.一个数对应一行和一列,二分答案,凡是小于等于答案的就连边.如果满足能够取出 \(n - k + 1\) 个不比二分中点 \(mid\) 大的数,那么r = mid, ...

  8. Linux之系统优化配置

    Linux系统优化配置 更新国内镜像源 国内速度快的常用更新源如下: ​ http://mirrors.sohu.com ​ http://mirrors.163.com [root@greymous ...

  9. 百度统计数据导出demo的坑

    1.用户名中文的问题 由于demo文件格式的问题,如果用户名使用中文的话,会出现一下问题 ----------------------preLogin----------------------  [ ...

  10. 第一章、ssh安装及远程登入配置

    1.Ubuntu下 确认 SSH Server 是否启动 输入: sudo ps -e | grep ssh. 如果正确启动, 命令行中会显示sshd. 安装服务端 OpenSSH Server 输入 ...