Delphi应用程序架构中有一种模式,采用DLL或Package存储业务窗体,当需要时从其中载入到主程序中,这时候需要对DLL或Package中窗体进行处理,步骤如下:

1、定义窗体基类

typeTfrmBase = class(TForm)Panel1: TPanel;private{ Private declarations }protectedprocedure Loaded;override;public{ Public declarations }procedure UpdateActions; override;end;TfrmBaseClass = class of TfrmBase;implementation{$R *.dfm}{ TfrmBase }procedure TfrmBase.Loaded;
begininherited;
  //将窗体改变为嵌入化 align   :=   alClient;BorderStyle   :=   bsNone;BorderIcons   :=   [];
end;procedure TfrmBase.UpdateActions;
begininherited;//将方法Public化
end;
 

2、创建具体的实例窗体

TfrmDll = class(TfrmBase)

3、通过窗体数据窗体类

function GetDllFormClass : TfrmBaseClass;
beginResult := TfrmDll;
end;exportsGetDllFormClass;

4、主窗体中动态载入DLL和创建DLL中的窗体对象

procedure TfrmMain.Button1Click(Sender: TObject);
beginif DllHandle > 0 thenExit;DllHandle := LoadLibrary('FormDll.dll');if DllHandle > 0 thenbeginGetDllFormClass := GetProcAddress(DllHandle, 'GetDllFormClass');ifAssigned(GetDllFormClass) thenbegin
      cfrm := GetDllformClass;vfrm := cfrm.Create(Application);      
      //设置窗体的Parent,通过ParentWindow方法实现,这点很重要vfrm.ParentWindow := TabSheet1.Handle;
    end;end;
end;

5、在主窗体上放置一个TApplicationEvents控件,在OnIdle事件中填写以下代码:

procedure TfrmMain.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin//当系统空闲时,处理子窗体的ActionUpdate事件if Assigned(vfrm) thenvfrm.UpdateActions;
end;

6、在OnMessage事件中填写以下代码:

procedure TfrmMain.ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);
begin//如果窗体变量存在,则需要对消息进行判断和处理,如果是窗体变量的消息,则不进一步处理if Assigned(vfrm) thenbeginif IsDialogMessage(vfrm.Handle, Msg) thenHandled := true;end;
end;
 

至此完成。

转载于:https://www.cnblogs.com/ChinaEHR/archive/2012/09/30/2709221.html

Delphi中DLL或Package窗体载入与显示相关推荐

  1. Delphi中DLL封装业务逻辑的实现

      三层结构是开发C/S或B/S系统经常采用的策略,这种分层方式将系统分为用户服务.业务服务和数据服务三部分,能够解决客户端与服务器结构维护成本问题.改善客户端与服务器结构延展性问题:解决应用逻辑重复 ...

  2. Delphi中DLL初始化和退出处理

    Delphi中DLL初始化和退出处理 choysan 2010-01-08 8:56:43 <1>利用Unit的Initalization与Finalization这两个小节 可以在Uni ...

  3. Delphi中实现MDI子窗体(转)

    用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容  ① 多文档窗体(MDI)  MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一个典型例子.MDI体系中至少需要两种窗 ...

  4. 关于Delphi中DLL,BPL等无法调试的问题

    今天,整插件框架的时候,调试的时候,整来整去,发现,无法进入插件DLL进行调试,诧异的蛋疼,相同的框架,以前写的代码,调试一切正常,随意怎么调试都可以,今天换一个项目上来,调试居然无法进入到DLL模块 ...

  5. 在Delphi中调用外部DLL 之External DLL 导入DLL

    调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. unit Unit1;interfaceu ...

  6. PBox 基于 Dll 动态库窗体的模块化开发平台 (已开源)

    一.由来:   1.每次开发一个新项目,都需要编写主界面,又要考虑各个子模块.重复造轮子.   2.写代码也好些年了.自己也写了很多小工具.分布在各个地方.需要使用的时候,到处找.十分不方便.     ...

  7. 如何在Delphi 中调用C#生成的DLL类库

    最近需要写一个和给上位机和下位机通讯的接口,而上位机是用Delphi开发的,所以就需要用C#做一类库给Delphi调用 大概步骤: 1.首先在VS2008中新建一个类项目名为TestDelphi,然后 ...

  8. delphi mysql dll直接_十万火急!!!那位高手用过libmysql.dll直接连接MySql数据库?如何将二进制文件保存到blob字段中? (60分)...

    先用php+mysql将文件通过web方式保存到远程的服务器的blob字段中,然后用 delphi+libmysql.dll直接连接远程MySql数据库,再将数据复制到本地的MySql数据库中. 代码 ...

  9. Delphi中动态调用DLL的方法

    Delphi中动态调用dll的方法如下: function CallFunc(dllname, funcname: string; const param: array of const): DWOR ...

最新文章

  1. 社团发现算法-BGLL算法(附代码实现)
  2. mysql连接超过8小时错误_mysql超过8小时数据库断掉连接的简单解决办法
  3. java instraction_Java Instruction.getCodeUnits方法代码示例
  4. JavaWeb-SpringBoot(抖音)_二、服务器间通讯
  5. (转-这篇文章非常棒) Thread的中断机制(interrupt)
  6. LeetCode 771. 宝石与石头(哈希)
  7. 【报告分享】百度大脑AI技术成果白皮书2018-2019.pdf
  8. python门牌制作
  9. 【java笔记】random类生成随机数
  10. 利用OFBiz实现Single Sign On单点登录
  11. 数学分析—集合与映射
  12. python批量新建文件夹_python批量创建文件夹
  13. 光纤与光通信-基础知识
  14. python如何设置当前工作路径?
  15. 计算机能力参考范文,信息技术能力论文,关于关于中学计算机教学的若干相关参考文献资料-免费论文范文...
  16. nginx 服务器的响应头,详解Nginx服务器中HTTP Headers相关的模块配置使用
  17. 基于黑寡妇优化算法的函数优化算法
  18. 验证随机数案例java_Java实现随机验证码功能实例代码
  19. base64上传为表单提交给后台的方法
  20. arm wifi ap热点功能

热门文章

  1. ×××××sales_data通过类型转换形成的临时对象不能转换成sales_data (非常量引用)
  2. 什么是计算机网络中的主机?
  3. java定义一个getsize方法,long getSize()
  4. c语言实现去除字符串首尾空格
  5. DES密码实现( C语言 )
  6. [BUUCTF-pwn]——gyctf_2020_borrowstack
  7. [BUUCTF-pwn]——jarvisoj_level302-21
  8. 小米8 android9手势,这么全面的小米手机操作手势你一定没见过
  9. 用计算机 发的,计算机的发分类及应用.ppt
  10. 償債基金(Sinking fund)