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