⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 upluginmanager.pas

📁 一个基于不需引擎的文件管理系统,使用了许多界面比较好的控件
💻 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 + -