这个DEMO用来演示服务的替换,用起来总是怪怪的感觉,效果图如下

代码如下

unit Frm_Main;

interface

uses
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.ExtCtrls,
Vcl.StdCtrls,
qplugins_base,
QPlugins; type
// 定义一个接口,方法由子类来实现
IEchoService = interface
['{E9A9E0D8-F278-46CC-9AA4-7FCD9CDAB77F}']
function Echo(S: string): string;
end; // Echo接口的实例
TEchoService = class(TQService, IEchoService)
function Echo(S: string): string;
end; TEchoReplacement = class(TInterfacedObject, IEchoService)
function Echo(S: string): string;
end; TForm_Main = class(TForm)
Button1: TButton;
Memo1: TMemo;
Panel1: TPanel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
FReplaced: IEchoService;
public
{ Public declarations }
end; var
Form_Main: TForm_Main; implementation {$R *.dfm} // 按钮_调用服务
procedure TForm_Main.Button1Click(Sender: TObject);
var
AService: IEchoService;
begin
// PluginsManager函数返回全局PluginsManager实例
AService := PluginsManager as IEchoService;
// 服务存在,则调用
if Assigned(AService) then
begin
Memo1.Lines.Add(AService.Echo('服务插件'));
end;
end; // 按钮_替换服务
procedure TForm_Main.Button2Click(Sender: TObject);
var
AService: IQService;
begin
// 在指定的父结点下,查找指定路径的服务
AService := FindService('/Services/Echo');
// 如果服务存在
if Assigned(AService) then
begin
// 撤销替换服务
if Assigned(FReplaced) then
begin
AService.RemoveExtension(FReplaced);
FReplaced := nil;
Button2.Caption := '替换服务';
end
else
begin
// 替换服务
FReplaced := TEchoReplacement.Create;
AService.AddExtension(FReplaced);
Button2.Caption := '撤销替换';
end;
end;
end;
{ TEchoService } // 原Echo函数
function TEchoService.Echo(S: string): string;
begin
Result := Format('类名[%s]: %s', [ClassName, S]);
end; { TEchoReplacement }
// 新Echo函数
function TEchoReplacement.Echo(S: string): string;
begin
Result := Format('新类名[%s]: %s', [ClassName, S]);
end; // 创建
procedure TForm_Main.FormCreate(Sender: TObject);
begin
// 注册TEchoService服务
RegisterServices('/Services', [TEchoService.Create(IEchoService, 'Echo')]);
end; end.

009.Delphi插件之QPlugins,服务的热插拔的更多相关文章

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

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

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

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

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

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

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

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

  5. 006.Delphi插件之QPlugins,多服务演示

    演示效果如下 演示工程,全部就一个文件,代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUt ...

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

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

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

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

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

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

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

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

随机推荐

  1. Just a Hook-HDU1698 区间染色+区间查询

    题意: hook有一根长度为n的棒,可以将它看成有n段,一开始每段都是铜,hook可以选择一段区间改变棒的属性, 棒有三种属性:铜=1,银=2,金=3,最后输出棒每段的属性总和. 链接:http:// ...

  2. LeetCode633. Sum of Square Numbers(双指针)

    题意:给定一个非负整数c,确定是否存在a和b使得a*a+b*b=c. class Solution { typedef long long LL; public: bool judgeSquareSu ...

  3. vim锁定,不能动

    在vim中 ctrl+s是锁屏命令, ctrl+q是解锁

  4. centos6.9下 svn 1.7.10版本 编译安装

    svn安装推荐文章: 1.    http://blog.51cto.com/myhat/786950 2.    https://blog.csdn.net/test1280/article/det ...

  5. 【转】 android之如何在两个activity之间传递handler_利用broadcast广播机制

    原文:http://blog.csdn.net/jason0539/article/details/18075293 这算是如何在两个activity之间传递handler的解决方案二了,解决方案一见 ...

  6. Mac安装navigate premium

    转自Navicat Premium for Mac v12.0.22.0 破解教程,macOS上手动破解,无需补丁,无毒今天换了电脑,想装一个Navicat,突然发现了这篇破解教程,竟爱不释手,顾Co ...

  7. mysql innodb cluster 无感知集群

    MySQL 8.0.12 innodb cluster 高可用集群部署运维管理手册 Innodb cluster 原理介绍 Innodb cluster  利用组复制的 pxos 协议,保障数据一致性 ...

  8. C++的注册和回调

    注册回调的作用 在设计模式中注册回调的方式叫做回调模式.在SDK开发中,为增强开发者的SDK通用性,排序或者一些算法逻辑需要使用者进行编写.这时候就需要向SDK传递回调函数.注册回调能使下层主动与上层 ...

  9. ecshop代码分析一(init.php文件)

    ecshop代码分析一(init.php文件)   因为工作原因,需要对ecshop二次开发,顺便记录一下对ecshop源代码的一些分析: 首先是init.php文件,这个文件在ecshop每个页面都 ...

  10. 清除编译缓存DerivedDate

    当多次重构工程造成代码没有错误却编译失败时,可以尝试删除DerivedData目录.DerivedData目录是Xcode的编译缓存,路径是~/Library/Developer/Xcode/Deri ...