摘要:
一个插件就是一个DLL或者BPL工程,只有经过注册的插件和注册的插件中的模块,主控程序才能识别并加载。1. 注册插件的数据表结构:如上图所示需要在数据表中登记插件的名称(比如PLUGIN1.DLL)和插件的说明(比如基本资料)。2. 注册插件中的模块的数据表结构:如上图所示需要在数据表中登记模块的编号,所属的父模块编号,模块的名称,所属插件的名称,模块的类名,说明 阅读全文
摘要:
只有使用REGISTERCLASS()方法注册了的类,才能使用FINDCLASS(className)方法查找然后创建类的实例对象。在每个单元的初始化节注册类。initialization RegisterClass(TDicForm);finalization UnRegisterClass(TDicForm);end. 阅读全文
摘要:
基类窗体要实现的需求包括:控件窗体的字体,权限控制,控制子窗体的显示范围,以及其它一些通用方法的声明。。。。。。通用方法可声明为VIRTUAL方法,以允许从它继承的子窗体可以OVERRIDE这些方法,达到多态的效果。unit uBaseForm;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;type TBaseForm = class(TForm) procedure FormClose(Sender: TObject; var Action: T 阅读全文
摘要:
在插件中需要对接口中的方法进行具体的实现,主控程序才能调用并执行插件中的具体功能。unit uPlug;interfaceuses uInterface, Forms, Windows, Classes, SysUtils;type TModelService = class(TInterfacedObject, IModelInts) private function CheckFormExists(aClassName: pchar): Boolean; public procedure Cmd(aClassName: PChar); // create visual plugin pro 阅读全文
摘要:
使用TRzMenuController控件只是为了增加主菜单的皮肤效果,可清除此控件主控程序的主窗口单元要实现的需求如下:1.自动识别并加载各个已经注册的插件;2.自动识别并加载各个已经注册的插件中的各个模块(自动生成系统的主菜单,自动生成各菜单项的点击事件);unit uMainForm;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Menus, Loader, Buttons, uInterface, 阅读全文
摘要:
主控程序和各插件之间通过预约的接口进行交互,这就是为什么主控程序能够自动识别插件的原因,因为主控程序和各插件早已经预约了接口。主控程序调用插件中的导出函数,取得导出函数的返回值,这个返回值返回的是某一个接口。一个导出函数的返回值可以返回一个接口,多个导出函数就可以返回多个接口。接口里面定义了许多的方法,通过接口可以调用到它里面的某一个方法,即调用了插件里面的某一项功能。插件框架里面可能需要定义多个接口,按照某一个原则对这些接口进行分类。比如日志操作接口,数据操作接口,权限操作接口。。。。。。可以在一个单元中集中定义插件框架中需要使用到的接口,然后在主控程序和各插件里面都要引用这个接口定义的单元 阅读全文
摘要:
获取插件中的预约接口,调用预约接口中的方法执行插件中某一项功能。unit Loader;interfaceuses DLLLoader, uInterface, SysUtils, Classes, windows;type TLoader = class(TDLLLoader) private FInts: IModelInts; function GetInts: IModelInts; public destructor destroy; override; property ModelServiceInts: IModelInts read GetInts; end;implement 阅读全文
摘要:
对于DELPHI来说,总共支持俩种类型的插件:DLL和BPL方式的插件。对于比较完美的插件框架来说,俩种类型的插件都要支持。unit DLLLoader;interfaceuses windows, Classes, SysUtils, Forms, StrUtils;type TLibraryType = (dll, bpl); // plugin type: dll or bpl TDLLLoader = class(TObject) private FHandle: THandle; FFileName: string; FLibraryType: TLibraryType; proce 阅读全文