bestlong 怕失憶論壇

 

 

搜索
bestlong 怕失憶論壇 論壇 Delphi 用 DLL 方式封裝 MDI 子視窗
查看: 3694|回復: 0
go

用 DLL 方式封裝 MDI 子視窗 [複製鏈接]

Rank: 9Rank: 9Rank: 9

1#
發表於 2006-8-4 09:20 |只看該作者 |倒序瀏覽 |打印
用DLL方式封装MDI子窗体是一种常用的软件开发技术,它的优点:

开发人员可以负责某一个模块的编写包括(界面+逻辑),可以互不干扰,模块开发完成后,主程序统一调用。
易于程序升级,当程序升级时,不用编译主exe文件,更新某个DLL就可以升级。
可以根据客户不同的需求、价钱给他们不同的模块。(奸商都愿意用这招)
最近用到这个技术,因为小弟没有用过,在网上google了一下,对它有了了解,我用的是基于COM的DLL,下面总结如下:

想在DLL中封装MDI子窗体,要注意以下几点:

你的DLL中的接口要有两个参数:第一,主程序的Application对象;第二,主程序窗体对象;
你要重写DLL入口函数
如果是基于COM的,要注意:因为COM没有TApplication和TForm类型,你在传入时需要强转为Integer。
需要注意的就这么多,下面结合例子看看(假设你已经建立了工程):

  1. TComDllTest1 = class(TAutoObject, IComDllTest1)
  2. Private
  3.   FMsgStr: WideString;
  4.   function GetMDIForm(AForm: TForm): boolean;
  5. protected
  6.   { Protected declarations }
  7.   function Get_MsgStr: WideString; safecall;
  8.   procedure Set_MsgStr(const Value: WideString); safecall;
  9.   procedure ShowMsgStr; safecall;
  10.   procedure CreateForm(AHandle: SYSUINT); safecall;
  11.   procedure CreateMdiForm(var AApp; AForm: SYSINT); safecall;    //创建MDI窗体 SYSINT为unsigned int
  12.   procedure CreateComTest(AForm: SYSUINT); safecall;
  13. public
  14.   constructor Create(AForm: SYSINT);
  15. end;
複製代碼


这是CreateMdiForm方法的实现:

  1. procedure TComDllTest1.CreateMdiForm(var AApp; AForm: SYSINT);
  2. var
  3.   app: TApplication;
  4.   af: TForm;
  5. begin
  6.   app := TApplication(AApp);      //将传进来的Application对象强转
  7.   af := TForm(AForm);             //将传进来的Form对象强转

  8.   Application := app;             //将主程序的application付给COM工程的application对象

  9.   if not GetMDIForm(Form1) then   //GetMDIForm 是判断窗体是否已经创建
  10.   begin
  11.     Form1 := TForm1.Create(af);   //创建子窗体
  12.     Form1.FormStyle := fsMDIChild;
  13.     Form1.Show;
  14.   end;
  15. end;
複製代碼


最后一步也是最关键的就是重写DLL入口函数,如果不重写,关闭主窗体时会报地址错误,我就吃过这亏(我汗......),在DLL工程文件中写:

  1. procedure DLLUnloadProc(Reason: Integer); register;
  2. begin
  3.   if (Reason = DLL_PROCESS_DETACH) or (Reason = DLL_THREAD_DETACH) then
  4.     Application := DLLApp; //DLLApp是在DLL工程文件中定义的全局TApplication对象
  5.   //用来保存Application对象
  6. end;
複製代碼


在DLL初始化的位置加入:

   DLLApp:=Application;         //保留Application
   DLLProc := @DLLUnloadProc;   //将重写后的入口函数地址付给DLLProc

这样就实现了DLL封装MDI子窗体,当然你要在子窗体上进行比如:数据库的操作,还要有更丰富的界面,肯定会遇到各种问题。
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw
‹ 上一主題|下一主題

Archiver|怕失憶論壇

GMT+8, 2024-5-5 10:14 , Processed in 0.011623 second(s), 10 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.