程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用DLL方式封裝MDI子窗體

用DLL方式封裝MDI子窗體

編輯:Delphi

  用DLL方式封裝MDI子窗體是一種常用的軟件開發技術,它的優點:

  1. 開發人員可以負責某一個模塊的編寫包括(界面+邏輯),可以互不干擾,模塊開發完成後,主程序統一調用。
  2. 易於程序升級,當程序升級時,不用編譯主exe文件,更新某個DLL就可以升級。
  3. 可以根據客戶不同的需求、價錢給他們不同的模塊。(奸商都願意用這招)

  最近用到這個技術,因為小弟沒有用過,在網上google了一下,對它有了了解,我用的是基於COM的DLL,下面總結如下:

  想在DLL中封裝MDI子窗體,要注意以下幾點:

  1. 你的DLL中的接口要有兩個參數:第一,主程序的Application對象;第二,主程序窗體對象;
  2. 你要重寫DLL入口函數
  3. 如果是基於COM的,要注意:因為COM沒有TApplication和TForm類型,你在傳入時需要強轉為Integer。

  需要注意的就這麼多,下面結合例子看看(假設你已經建立了工程):

    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子窗體,當然你要在子窗體上進行比如:數據庫的操作,還要有更豐富的界面,肯定會遇到各種問題。以後總結了再說吧!^_^

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved