014.Delphi插件之QPlugins,MDI窗口
不知道为什么,这个DEMO编译出来报错,运行不了,在QDAC群里问了一下也没人响应。
效果如下
主程序代码如下
- unit Frm_Main;
- interface
- uses
- Winapi.Windows,
- Winapi.Messages,
- System.SysUtils,
- System.Variants,
- System.Classes,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.Menus,
- QPlugins,
- qplugins_params,
- qplugins_formsvc,
- qplugins_vcl_formsvc,
- qplugins_loader_lib;
- { 注意使用 MDI 子窗体做为插件,宿主和插件都必需同时引用rtl/vcl运行时包 }
- type
- TForm_Main = class(TForm)
- MainMenu1: TMainMenu;
- File1: TMenuItem;
- procedure FormCreate(Sender: TObject);
- procedure File1Click(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- private
- { Private declarations }
- FOpenChildren: array of IQFormService;
- procedure DoFormClosed(AForm: IQFormService; var Action: TCloseAction);
- procedure DoFormFree(AForm: IQFormService);
- public
- { Public declarations }
- end;
- var
- Form_Main: TForm_Main;
- implementation
- {$R *.dfm}
- procedure TForm_Main.DoFormClosed(AForm: IQFormService; var Action: TCloseAction);
- var
- I: Integer;
- begin
- // 方法1:设置Action为caFree,然后由DoFormFree事件来处理清理服务
- // Action := caFree;
- // 方法2:直接释放引用就可以,优点是不用处理 OnFree 事件了
- for I := to High(FOpenChildren) do
- begin
- if FOpenChildren[I] = AForm then
- begin
- Delete(FOpenChildren, I, );
- Break;
- end;
- end;
- end;
- procedure TForm_Main.DoFormFree(AForm: IQFormService);
- var
- I: Integer;
- begin
- // 直接释放引用就可以
- for I := to High(FOpenChildren) do
- begin
- if FOpenChildren[I] = AForm then
- begin
- Delete(FOpenChildren, I, );
- Break;
- end;
- end;
- end;
- // 菜单_新建
- procedure TForm_Main.File1Click(Sender: TObject);
- var
- AService: IQFormService;
- // 窗体事件
- AEvents: TQFormEvents;
- begin
- if Supports(PluginsManager.ByPath('/Services/Forms/MDI/MDITest'), IQFormService, AService) then
- begin
- // 设置窗体事件
- FillChar(AEvents, SizeOf(AEvents), );
- // 替换窗体的关闭和释放事件
- AEvents.OnClose := DoFormClosed;
- AEvents.OnFree := DoFormFree;
- AService.HookEvents(AEvents);
- AService.Show;
- // FOpenChildren数组长度+1,为了添加一个AService
- SetLength(FOpenChildren, Length(FOpenChildren) + );
- FOpenChildren[High(FOpenChildren)] := AService;
- end;
- end;
- procedure TForm_Main.FormClose(Sender: TObject; var Action: TCloseAction);
- var
- I: Integer;
- AEvents: TQFormEvents;
- begin
- // 在直接关闭前,要先移除事件关联,否则在服务释放时,回调DoFormFree时会出错
- FillChar(AEvents, SizeOf(AEvents), );
- // 遍历移除替换的窗体事件
- for I := to High(FOpenChildren) do
- begin
- FOpenChildren[I].HookEvents(AEvents);
- end;
- // 清空
- SetLength(FOpenChildren, );
- end;
- // 创建
- procedure TForm_Main.FormCreate(Sender: TObject);
- begin
- with PluginsManager do
- begin
- // 加载同目录下dll文件
- Loaders.Add(TQDLLLoader.Create(ExtractFilePath(Application.ExeName), '.dll'));
- // 启动服务
- Start;
- end;
- end;
- end.
DLL代码如下
- unit Frm_Mdi;
- interface
- uses
- Winapi.Windows,
- Winapi.Messages,
- System.SysUtils,
- System.Variants,
- System.Classes,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs;
- type
- TForm_Mdi = class(TForm)
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form_Mdi: TForm_Mdi;
- implementation
- uses
- QPlugins,
- qplugins_vcl_formsvc;
- {$R *.dfm}
- initialization
- // 注册一个单实例服务
- RegisterFormService('/Services/Forms/MDI', 'MDITest', TForm_Mdi);
- finalization
- // 注销
- UnregisterServices('/Services/Forms/MDI', ['MDITest']);
- end.
014.Delphi插件之QPlugins,MDI窗口的更多相关文章
- 015.Delphi插件之QPlugins,FMX插件窗口
内嵌FMX的插件窗口,效果还是很可以的.退出时,会报错,很诡异啊. 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messa ...
- 012.Delphi插件之QPlugins,多实例内嵌窗口服务
这个DEMO中主要是在DLL中建立了一个IDockableControl类,并在DLL的子类中写了具体的实现方法. 在主程序exe中,找到这个服务,然后调用DLL的内嵌方法,把DLL插件窗口内嵌到主程 ...
- 013.Delphi插件之QPlugins,模块化代码示例
这个DEMO的是一个定义了一个窗体插件接口,把其他窗口注册到这个窗体插件接口中.主程序运行起来,就遍历一下窗体插件接口,把每个窗体内嵌到对话框中 运行效果如下 主窗口代码如下 unit Frm_Mai ...
- 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 ...
- 004.Delphi插件之QPlugins,参数传递
界面如下 插件框架中大量使用了接口的东西,看的眼花缭乱,很多地方只做了申明,具体的实现是在另外的子类. DLL的代码如下 unit ParamTest; interface uses classes, ...
- 003.Delphi插件之QPlugins,菜单插件加强
相比上一篇的菜单插件,这个在创建和销毁时候,做了增强,同时做了2个菜单对应的窗口 unit MenuSvc; interface uses windows, classes, SysUtils, Gr ...
- 001.Delphi插件之QPlugins,一个最简单的插件
安装QPlugins里面的Demo,复制粘贴着写了一个最简单的插件,看看好不好用 EXE代码如下: unit Main_Frm; interface uses Winapi.Windows, Wina ...
- 011.Delphi插件之QPlugins,延时加载服务
这个DEMO是是把DLL插件的相关信息做成了一个配置文件,主程序加载这个配置文件,从而起到延时加载的作用 主程序代码如下 unit Frm_Main; interface uses Winapi.Wi ...
随机推荐
- 杭电2024 C语言合法标识符
链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2024 开始真的对这题是一点头绪都没有,简直了.然后事实证明是我想多了,这题主要是把概念给弄清楚 ...
- mybaits requestMap与requestType,以及对应的注解
有的时候不喜欢用xml配置文件,但是xml配置文件的开发使用简单,自己经常要用到: 因为代码维护的缘故,有的时候看别人的代码,可能存在大量的mappper文件,也不是你想用注解就用注解的: 下面我还是 ...
- Sping IOC容器
Sping IOC容器 package servlet; import org.springframework.context.ApplicationContext; import org.sprin ...
- Linux命令:ifconfig命令
ifconfig功能:配置网络接口,CentOS7最小化安装不包含此命令,需要安装net-tools包. ifconfig常见的用法: ifconfig :显示所有活动接口的相关信息 ifconfig ...
- Android。WebView加载UR请求使用Cookie储存User_Id记录用户是否登陆过
1.WebView初始化的时候用倒如下代码: if (Build.VERSION.SDK_INT >= 21) { CookieManager.getInstance().setAcceptTh ...
- 《容器化.NET应用架构指南》脑图学习笔记(第一部分)
一.关于这本官方“圣经” 作为.NET程序员,对于微软官方推动的架构示例总是特别关注,从PetShop到MusicStore再到eShopOnContainers,每一次关注,都会了解到业界最新的架构 ...
- 从零开始-建站前的准备之django数据库创建的问题
稍微熟悉了一下django里面对于数据的操作,发现遇见了好多的问题. django对数据的操作是代码式的操作. 一开始在models里面开始为某个表创建参数,像username,password这样的 ...
- 记录:一次使用私有LoadBalance provider,工具metallb的故障排除
使用metallb工具,目的是为私有环境下,不借助GRE或Azure等云商的LB, 通过metallb-system工具IP池给k8s service提供external-ip.但是,由于设置meta ...
- IntelliJ IDEA Debug模式启动项目
导入项目,没有看到debug模式 点击 next next next next
- JS中的原始类型和判断方法
ECMAScript 中定义了 7 种原始类型: Boolean String Number Null Undefined Symbol(新定义) BigInt(新定义) 注意: 原始类型不包含 Ob ...