Delphi中DLL或Package窗体载入与显示
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窗体载入与显示相关推荐
- Delphi中DLL封装业务逻辑的实现
三层结构是开发C/S或B/S系统经常采用的策略,这种分层方式将系统分为用户服务.业务服务和数据服务三部分,能够解决客户端与服务器结构维护成本问题.改善客户端与服务器结构延展性问题:解决应用逻辑重复 ...
- Delphi中DLL初始化和退出处理
Delphi中DLL初始化和退出处理 choysan 2010-01-08 8:56:43 <1>利用Unit的Initalization与Finalization这两个小节 可以在Uni ...
- Delphi中实现MDI子窗体(转)
用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容 ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一个典型例子.MDI体系中至少需要两种窗 ...
- 关于Delphi中DLL,BPL等无法调试的问题
今天,整插件框架的时候,调试的时候,整来整去,发现,无法进入插件DLL进行调试,诧异的蛋疼,相同的框架,以前写的代码,调试一切正常,随意怎么调试都可以,今天换一个项目上来,调试居然无法进入到DLL模块 ...
- 在Delphi中调用外部DLL 之External DLL 导入DLL
调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. unit Unit1;interfaceu ...
- PBox 基于 Dll 动态库窗体的模块化开发平台 (已开源)
一.由来: 1.每次开发一个新项目,都需要编写主界面,又要考虑各个子模块.重复造轮子. 2.写代码也好些年了.自己也写了很多小工具.分布在各个地方.需要使用的时候,到处找.十分不方便. ...
- 如何在Delphi 中调用C#生成的DLL类库
最近需要写一个和给上位机和下位机通讯的接口,而上位机是用Delphi开发的,所以就需要用C#做一类库给Delphi调用 大概步骤: 1.首先在VS2008中新建一个类项目名为TestDelphi,然后 ...
- delphi mysql dll直接_十万火急!!!那位高手用过libmysql.dll直接连接MySql数据库?如何将二进制文件保存到blob字段中? (60分)...
先用php+mysql将文件通过web方式保存到远程的服务器的blob字段中,然后用 delphi+libmysql.dll直接连接远程MySql数据库,再将数据复制到本地的MySql数据库中. 代码 ...
- Delphi中动态调用DLL的方法
Delphi中动态调用dll的方法如下: function CallFunc(dllname, funcname: string; const param: array of const): DWOR ...
最新文章
- 社团发现算法-BGLL算法(附代码实现)
- mysql连接超过8小时错误_mysql超过8小时数据库断掉连接的简单解决办法
- java instraction_Java Instruction.getCodeUnits方法代码示例
- JavaWeb-SpringBoot(抖音)_二、服务器间通讯
- (转-这篇文章非常棒) Thread的中断机制(interrupt)
- LeetCode 771. 宝石与石头(哈希)
- 【报告分享】百度大脑AI技术成果白皮书2018-2019.pdf
- python门牌制作
- 【java笔记】random类生成随机数
- 利用OFBiz实现Single Sign On单点登录
- 数学分析—集合与映射
- python批量新建文件夹_python批量创建文件夹
- 光纤与光通信-基础知识
- python如何设置当前工作路径?
- 计算机能力参考范文,信息技术能力论文,关于关于中学计算机教学的若干相关参考文献资料-免费论文范文...
- nginx 服务器的响应头,详解Nginx服务器中HTTP Headers相关的模块配置使用
- 基于黑寡妇优化算法的函数优化算法
- 验证随机数案例java_Java实现随机验证码功能实例代码
- base64上传为表单提交给后台的方法
- arm wifi ap热点功能
热门文章
- ×××××sales_data通过类型转换形成的临时对象不能转换成sales_data (非常量引用)
- 什么是计算机网络中的主机?
- java定义一个getsize方法,long getSize()
- c语言实现去除字符串首尾空格
- DES密码实现( C语言 )
- [BUUCTF-pwn]——gyctf_2020_borrowstack
- [BUUCTF-pwn]——jarvisoj_level302-21
- 小米8 android9手势,这么全面的小米手机操作手势你一定没见过
- 用计算机 发的,计算机的发分类及应用.ppt
- 償債基金(Sinking fund)