用DLL方式封裝MDI子窗體是一種常用的軟件開發技術,它的優點:
最近用到這個技術,因為小弟沒有用過,在網上google了一下,對它有了了解,我用的是基于COM的DLL,下面總結如下:
想在DLL中封裝MDI子窗體,要注意以下幾點:
需要注意的就這么多,下面結合例子看看(假設你已經建立了工程):
  TComDllTest1 = class(TAutoObject, IComDllTest1)
  PRivate
    FMsgStr: WideString;
    function GetMDIForm(AForm: TForm): boolean;
  protected
    { Protected declarations }
    function Get_MsgStr: WideString; safecall;
    procedure Set_MsgStr(const Value: WideString); safecall;
    procedure ShowMsgStr; safecall;
    procedure CreateForm(AHandle: SYSUINT); safecall;
    procedure CreateMdiForm(var AApp; AForm: SYSINT); safecall;    //創建MDI窗體 SYSINT為unsigned int
    procedure CreateComTest(AForm: SYSUINT); safecall;
  public
    constructor Create(AForm: SYSINT);
  end;
這是CreateMdiForm方法的實現:
procedure TComDllTest1.CreateMdiForm(var AApp; AForm: SYSINT);
var
  app: TApplication;
  af: TForm;
begin
  app := TApplication(AApp);               //將傳進來的Application對象強轉
  af := TForm(AForm);                           //將傳進來的Form對象強轉
Application := app; //將主程序的application付給COM工程的application對象
  if not GetMDIForm(Form1) then        //GetMDIForm 是判斷窗體是否已經創建
  begin
    Form1 := TForm1.Create(af);        //創建子窗體
  Form1.FormStyle := fsMDIChild;
  Form1.Show;
  end;
end;
最后一步也是最關鍵的就是重寫DLL入口函數,如果不重寫,關閉主窗體時會報地址錯誤,我就吃過這虧(我汗......),在DLL工程文件中寫:
procedure DLLUnloadProc(Reason: Integer); register;
begin
 if (Reason = DLL_PROCESS_DETACH) or (Reason = DLL_THREAD_DETACH) then Application := DLLApp;                           //DLLApp是在DLL工程文件中定義的全局TApplication對象
                                          //用來保存Application對象
end;
在DLL初始化的位置加入:
   DLLApp:=Application;                                 //保留Application
   DLLProc := @DLLUnloadProc;                //將重寫后的入口函數地址付給DLLProc
這樣就實現了DLL封裝MDI子窗體,當然你要在子窗體上進行比如:數據庫的操作,還要有更豐富的界面,肯定會遇到各種問題。以后總結了再說吧!^_^
新聞熱點
疑難解答