📄 upluginmanager.pas
字号:
unit uPlugInManager;
interface
uses
classes, windows, uSecPlugInf, SysUtils, Dialogs, uDllfrmList, SpTBXItem,Graphics,
TB2Item, uIAppInf, uIAppImp, uFunction, Forms, TB2Dock, TBX, variants,TBXThemes;
type
TPlugInManager=class
private
FPlugToolbar:TTBXToolbar;
procedure OnExecute(Sender:TObject);
procedure OnAction(Sender:TObject);
procedure DoDrawMenuItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; ItemInfo: TTBXItemInfo;
const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean);
procedure CreatePlugBtn(ASecPlug:ISecPlug);
public
FPlugs:TInterfaceList;
constructor create;
destructor destroy;override;
function AddPlugIn(AFileName:string):ISecPlug;
procedure DelPlugIn(AFileName,PlugName:string);
procedure LoadMainPlugIn;
procedure UnLoadAllPlugIn;
procedure Child_CreatePlugBtn(DllName:string;AFrm:TForm;ASecPlug:ISecPlug);
procedure Child_DeletePlugBtn(DllName:string;AFrm:TForm;AName:wideString);
end;
TLoadSecPlugModule=function(const App:IApp):ISecPlug;stdcall;
TUnLoadSecPlugModule=procedure;stdcall;
TChild_CreatePlugBtn=procedure(const AFrm:TForm;const ASecPlug:ISecPlug);stdcall;
TChild_DeletePlugBtn=procedure(const AFrm:TForm;const AName:wideString);stdcall;
implementation
uses uSECData, uMain;
{ TPlugInManager }
function TPlugInManager.AddPlugIn(AFileName: string):ISecPlug;
var
DllHandle:THandle;
LoadSecPlugModule:TLoadSecPlugModule;
UnLoadSecPlugModule:TUnLoadSecPlugModule;
SecPlug:ISecPlug;
i:integer;
s,s1:string;
FullName:string;
begin
result:=nil;
FullName:=ExtractFileDir(paramstr(0))+'\Plugin\'+AFileName;
DLLHandle:=GetModuleHandle(pchar(FullName));
if DLLHandle=0 then
begin
DLLHandle:=LoadLibrary(pchar(FullName));
if DllHandle<>0 then
begin
@LoadSecPlugModule:=GetProcAddress(DllHandle,'LoadSecPlugModule');
if @LoadSecPlugModule=nil then
begin
raise Exception.Create('插件错误。');
end;
SecPlug:=LoadSecPlugModule(App);
for i:=0 to FPlugs.Count-1 do
begin
s:=SecPlug.Name;
s1:=(FPlugs[i] as ISecPlug).Name;
if lowercase(s)=lowercase(s1) then
begin
SecPlug:=nil;
@UnLoadSecPlugModule:=GetProcAddress(DllHandle,'UnLoadSecPlugModule');
if @UnLoadSecPlugModule<>nil then
UnLoadSecPlugModule;
FreeLibrary(DllHandle);
raise Exception.Create('已经存在“'+s1+'”插件对象。');
end;
end;
if SecPlug<>nil then
begin
SecData.qryTmp.Close;
SecData.qryTmp.SQL.Clear;
SecData.qryTmp.SQL.Text:='insert into Plugin(Name,Ver,Description,FileName,PlugType,AutoExec,DisplayInMenu,DrawMenu)'+#13+
'values(:Name,:Ver,:Description,:FileName,:PlugType,:AutoExec,:DisplayInMenu,:DrawMenu)';
SecData.qryTmp.ParamByName('Name').AsString:=SecPlug.Name;
SecData.qryTmp.ParamByName('Ver').AsString:=SecPlug.Ver;
SecData.qryTmp.ParamByName('Description').AsString:=SecPlug.Description;
SecData.qryTmp.ParamByName('FileName').AsString:=AFileName;
SecData.qryTmp.ParamByName('PlugType').AsInteger:=integer(SecPlug.PlugType);
SecData.qryTmp.ParamByName('AutoExec').AsInteger:=integer(SecPlug.AutoExec);
SecData.qryTmp.ParamByName('DisplayInMenu').AsInteger:=integer(SecPlug.DisplayInMenu);
SecData.qryTmp.ParamByName('DrawMenu').AsInteger:=integer(SecPlug.DrawMenu);
SecData.qryTmp.ExecSQL;
FPlugs.Add(SecPlug);
SecPlug.Load;
if SecPlug.PlugType=ptMain then
begin
CreatePlugBtn(SecPlug);
end
else
begin
//如果存在子窗体,则加载子插件。
for i:=0 to mainfrm.MDIChildCount-1 do
begin
if TDllfrm(mainfrm.MDIChildren[i]).DllType=aList then
begin
if TDllfrm(mainfrm.MDIChildren[i]).ID=-(integer(SecPlug.PlugType)) then
begin
Child_CreatePlugBtn('List.dll',mainfrm.MDIChildren[i],SecPlug);
end;
end
else if TDllfrm(mainfrm.MDIChildren[i]).DllType=aText then
begin
if SecPlug.PlugType=ptText then
begin
Child_CreatePlugBtn('Ft.dll',mainfrm.MDIChildren[i],SecPlug);
end;
end;
end;
end;
result:=SecPlug;
end;
end;
end;
end;
constructor TPlugInManager.create;
begin
FPlugs:=TInterfaceList.Create;
end;
procedure TPlugInManager.CreatePlugBtn(ASecPlug:ISecPlug);
begin
CreateToolBarBtn(mainfrm.SpTBXDock1,1,200,FPlugToolbar,ASecPlug,OnExecute);
FPlugToolbar.DockableTo:=[dpTop];
CreateToolPopupMenuItem(mainfrm.TBXPopupMenu2,ASecPlug,OnAction,DoDrawMenuItem);
end;
procedure TPlugInManager.DelPlugIn(AFileName,PlugName: string);
var
DllHandle:THandle;
UnLoadSecPlugModule:TUnLoadSecPlugModule;
FullName:string;
procedure Delete;
var
s:widestring;
i,j:integer;
begin
for i:=0 to FPlugs.Count-1 do
begin
s:=(FPlugs[i] as ISecPlug).Name;
if s=PlugName then
begin
ISecPlug(FPlugs[i]).UnLoad;//释放插件内部对象
if ISecPlug(FPlugs[i]).PlugType=ptMain then
begin
DeleteToolBarBtn(FPlugToolbar,PlugName);
DeleteToolPopupMenuItem(mainfrm.TBXPopupMenu2,PlugName);
end
else
begin
for j:=0 to mainfrm.MDIChildCount-1 do
begin
if TDllfrm(mainfrm.MDIChildren[j]).DllType=aList then
begin
if TDllfrm(mainfrm.MDIChildren[j]).ID=-(integer(ISecPlug(FPlugs[i]).PlugType)) then
begin
Child_DeletePlugBtn('List.dll',mainfrm.MDIChildren[j],PlugName);
end;
end
else if TDllfrm(mainfrm.MDIChildren[j]).DllType=aText then
begin
if ISecPlug(FPlugs[i]).PlugType=ptText then
begin
Child_DeletePlugBtn('ft.dll',mainfrm.MDIChildren[j],PlugName);
end;
end;
end;
end;
FPlugs[i]:=nil;
FPlugs.Delete(i);
break;
end;
end;
end;
begin
FullName:=ExtractFileDir(paramstr(0))+'\Plugin\'+AFileName;
DLLHandle:=GetModuleHandle(pchar(FullName));
SecData.qryTmp.Close;
SecData.qryTmp.SQL.Clear;
SecData.qryTmp.SQL.Text:='delete from Plugin where FileName=:FileName';
SecData.qryTmp.ParamByName('FileName').AsString:=AFileName;
SecData.qryTmp.ExecSQL;
Delete;
if DllHandle<>0 then
begin
@UnLoadSecPlugModule:=GetProcAddress(DllHandle,'UnLoadSecPlugModule');
if @UnLoadSecPlugModule<>nil then
UnLoadSecPlugModule;//释放插件对象
FreeLibrary(DLLHandle);//释放插件dll
end;
end;
destructor TPlugInManager.destroy;
begin
inherited;
end;
procedure TPlugInManager.Child_CreatePlugBtn(DllName:string;AFrm: TForm;
ASecPlug: ISecPlug);
var
DllHandle:THandle;
fun:TChild_CreatePlugBtn;
begin
DllHandle:=GetModuleHandle(Pchar(DllName));
if DllHandle<>0 then
begin
@fun:=GetProcAddress(DllHandle,'CreatePlugBtn');
if @fun<>nil then
begin
fun(AFrm,ASecPlug);
end;
end;
end;
procedure TPlugInManager.Child_DeletePlugBtn(DllName:string;AFrm: TForm;
AName:wideString);
var
DllHandle:THandle;
fun:TChild_DeletePlugBtn;
begin
DllHandle:=GetModuleHandle(PChar(DllName));
if DllHandle<>0 then
begin
@fun:=GetProcAddress(DllHandle,'DeletePlugBtn');
if @fun<>nil then
begin
fun(AFrm,AName);
end;
end;
end;
procedure TPlugInManager.LoadMainPlugIn;
var
DllHandle:Thandle;
FileName:string;
SecPlug:ISecPlug;
LoadSecPlugModule:TLoadSecPlugModule;
FileList:TStringList;
i:integer;
begin
SecData.qryTmp.Close;
SecData.qryTmp.SQL.Clear;
SecData.qryTmp.SQL.Text:='select FileName from PlugIn order by Description';
SecData.qryTmp.Open;
FileList:=TStringList.Create;
while not SecData.qryTmp.Eof do
begin
FileList.Add(SecData.qryTmp.fieldbyname('FileName').AsString);
SecData.qryTmp.Next;
end;
SecData.qryTmp.Close;
for i:=0 to FileList.Count-1 do
begin
FileName:=ExtractFileDir(paramstr(0))+'\Plugin\'+FileList[i];
DLLHandle:=LoadLibrary(pchar(FileName));
if DllHandle<>0 then
begin
@LoadSecPlugModule:=GetProcAddress(DllHandle,'LoadSecPlugModule');
if @LoadSecPlugModule<>nil then
begin
SecPlug:=LoadSecPlugModule(App);
FPlugs.Add(SecPlug);
SecPlug.Load;
if SecPlug.PlugType=ptMain then
begin
CreatePlugBtn(SecPlug);
end;
SecData.qryTmp.Close;
SecData.qryTmp.SQL.Clear;
SecData.qryTmp.SQL.Text:='Update Plugin'+#13+
'set Name=:Name,Ver=:Ver,Description=:Description,'+#13+
' PlugType=:PlugType,AutoExec=:AutoExec,DisplayInMenu=:DisplayInMenu,DrawMenu=:DrawMenu'+#13+
' where Name=:Name';
SecData.qryTmp.ParamByName('Name').AsString:=SecPlug.Name;
SecData.qryTmp.ParamByName('Ver').AsString:=SecPlug.Ver;
SecData.qryTmp.ParamByName('Description').AsString:=SecPlug.Description;
SecData.qryTmp.ParamByName('PlugType').AsInteger:=integer(SecPlug.PlugType);
SecData.qryTmp.ParamByName('AutoExec').AsInteger:=integer(SecPlug.AutoExec);
SecData.qryTmp.ParamByName('DisplayInMenu').AsInteger:=integer(SecPlug.DisplayInMenu);
SecData.qryTmp.ParamByName('DrawMenu').AsInteger:=integer(SecPlug.DrawMenu);
SecData.qryTmp.ExecSQL;
end;
end;
end;
FileList.Free;
end;
procedure TPlugInManager.OnExecute(Sender: TObject);
var
i:integer;
begin
for i:=0 to FPlugs.Count-1 do
begin
if TSpTBXItem(sender).Name=ISecPlug(FPlugs[i]).Name then
begin
ISecPlug(FPlugs[i]).HostForm:=mainfrm;
ISecPlug(FPlugs[i]).HostID:=-1;
ISecPlug(FPlugs[i]).Execute;
break;
end;
end;
end;
procedure TPlugInManager.OnAction(Sender: TObject);
var
i:integer;
begin
for i:=0 to FPlugs.Count-1 do
begin
if TSpTBXItem(sender).Name=ISecPlug(FPlugs[i]).Name then
begin
ISecPlug(FPlugs[i]).Action(VarArrayOf([]));
break;
end;
end;
end;
procedure TPlugInManager.DoDrawMenuItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; ItemInfo: TTBXItemInfo; const PaintStage: TSpTBXPaintStage;
var PaintDefault: Boolean);
begin
DrawMenuItem(TSpTBXItem(sender).Name,FPlugs,ACanvas,ARect);
end;
procedure TPlugInManager.UnLoadAllPlugIn;
var
i:integer;
begin
for i:=FPlugs.Count-1 downto 0 do
begin
ISecPlug(FPlugs[i]).UnLoad;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -