社区
Delphi
帖子详情
大侠:请问 调用DLL生成的MDI子窗体,想关闭怎么办???
yurenjf
2003-08-22 08:41:19
调用DLL生成的MDI子窗体,怎么关闭呀? 又不能隐藏,但是关闭后如果再调出就会出错
有什么高招,帮帮小弟,拜托
...全文
55
7
打赏
收藏
大侠:请问 调用DLL生成的MDI子窗体,想关闭怎么办???
调用DLL生成的MDI子窗体,怎么关闭呀? 又不能隐藏,但是关闭后如果再调出就会出错 有什么高招,帮帮小弟,拜托
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
FrameSniper
2003-09-15
打赏
举报
回复
你的是动态创建的吗?如果是动态创建的,怎么可能关闭后在调用又出错呢?
而且是否指定了子窗体的Owner对象?
AWolfBoy
2003-09-15
打赏
举报
回复
转载,希望能对有你帮助
作为一个经常被提起的问题,很多人不知道怎么来从DLL中导出窗体,特别是MDI的子窗体,因此Kingron愿意在这里把一些经验写出来给大家分享,让大家在碰到类似的问题的时候,少走些弯路。
大家知道,DLL有两种加载方式,至于动态的,和静态的,稍微有点儿区别。动态的加载,大家可以参考Torry's Delphi Page上面的例子,其中有一个MDI的例子,非常简单的,很好用。我的例子以静态加载为主。
据目前来看,我们要在DLL中导出这个Form的话,必须通过DLL导出函数来做到,但是我们知道DLL工程的Application和Host程序的Application是有区别的,对于一般的应用程序来说,Application是VCL固定的,一般不会修改Application对象指针,但是在DLL中,我们需要使用窗体等,或者使用Application对象的时候,使DLL的Application和Host程序一样,这样才不至于混淆。以下面的例子为例,如果不修改Application对象,那么Host程序退出的时候,可能出现AV错误!例如:
在Host中Export一个函数:
function DllFunction(App:TApplication;PForm:TForm):TForm2;stdcall;
begin
Result :=TForm2.Create(PForm);
end;
那么主程序推出的时候,很可能发生AV错误。
下面一步一步来做:
首先,我们需要一个DLL工程,在IDE中New一个DLL,然后New一个Form,Save All File,工程名为DLL.DPR,Form的Unit文件为DLLForm.pas,窗体类名为FrmDLLChild。然后随便设计这个DLLChild Form即可。
然后,在DLL.DPR中修改代码,添加:
library Dll;
uses
SysUtils,windows,
Classes,Controls,Forms,
DllForm in 'DllForm.pas' ;
{$R *.res}
var
DllApp:TApplication;
{ 用于初始化:保存DLL本身的Application,然后设置DLL的Application指向Host的Application }
procedure InitDLL(App:TApplication);stdcall;
begin
DllApp:=Application;
Application:=App;
end;
{ 善后工作:恢复DLL原来的Application }
procedure FreeDLL;stdcall;
begin
Application:=DllApp;
end;
{ 返回一个窗体对象,这是DLL的主要功能 }
function GetDllChildForm(Parent:TComponent):TFrmDLLChild;stdcall;
begin
Result := TFrmDLLChild.Create(Parent);
end;
exports
InitDLL,FreeDLL,GetDllChildForm;
begin
end.
至此DLL已经完成了,在使用DLL的时候,需要注意:首先必须调用InitDLL,并且传递主程序的Application作为参数,否则主程序退出的时候,会报AV错误。
主程序调用如下:
为了简单方便地使用,可以把DLL中包含窗体的那个单元Use进来,如果不喜欢,用类型强制也可。
function GetDllChildForm(Parent:TComponent):TFrmDllChild;stdcall;external 'dll.dll';
procedure InitDLL(App:TApplication);stdcall;external 'dll.dll';
procedure FreeDLL;stdcall;external 'dll.dll';
procedure TForm1.FormCreate(Sender: TObject);
begin
InitDLL(Application);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeDLL;
end;
调用窗体代码:
var
DForm:TFrmDllChild;
begin
DForm :=DllFunction(Application,Self);
DForm.Show;
end;
yurenjf
2003-09-15
打赏
举报
回复
心情不好, 散分了................
movingboy2
2003-08-22
打赏
举报
回复
最好贴出你创建该窗体的代码来,大家才好帮你分析。
永远专注NET
2003-08-22
打赏
举报
回复
不用那么费事。只要
在onclose事件里写下:
action:=cafree;
form1:=nil;
MMisLady
2003-08-22
打赏
举报
回复
调用时如下,没问题
try
if fmMDI=nil then fmMDI:=TfmMDI.Create(Application);
fmMDI.ShowModal ;
finally
Application.Handle:=0;
fmMDI.Free;
fmMDI:=nil;
end;
deeply
2003-08-22
打赏
举报
回复
在OnClose中写
Action:=CaFree;
Self := nil;
C# For Unity系列之入门篇
你
想
当“李逍遥”式的“
大侠
”吗? 这里无需计算机基础,无需编程经验,你也不必是计算机专业的在校大学生....只要爱好游戏,怀揣梦
想
! 有一定自主学习能力,跟着刘老师从“编程小白”修炼为游戏研发“大虾”吧!!!学习好Unity,其先决条件是一定要有稳固、扎实的编程基础!课程 《C# For Unity系列之入门篇》配套学习资料链接:http://pan.baidu.com/s/1gflxreN 密码:sou5;刘老师讲Unity学员群(2) 497429806一、热更新系列(技术含量:中高级):A:《lua热更新技术中级篇》https://edu.csdn.net/course/detail/27087B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136二:框架设计系列(技术含量:中级): A:《游戏UI界面框架设计系列视频课程》https://edu.csdn.net/course/detail/27142B:《Unity客户端框架设计PureMVC篇视频课程(上)》https://edu.csdn.net/course/detail/27172C:《Unity客户端框架设计PureMVC篇视频课程(下)》https://edu.csdn.net/course/detail/27173D:《AssetBundle框架设计_框架篇视频课程》https://edu.csdn.net/course/detail/27169三、Unity脚本从入门到精通(技术含量:初级)A:《C# For Unity系列之入门篇》https://edu.csdn.net/course/detail/4560B:《C# For Unity系列之基础篇》https://edu.csdn.net/course/detail/4595C: 《C# For Unity系列之中级篇》https://edu.csdn.net/course/detail/24422D:《C# For Unity系列之进阶篇》https://edu.csdn.net/course/detail/24465四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)A:《虚拟现实之汽车仿真模拟系统 》https://edu.csdn.net/course/detail/26618五、Unity基础课程系列(技术含量:初级) A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》 https://edu.csdn.net/course/detail/24643B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》https://edu.csdn.net/course/detail/24645 C:《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096六、Unity ARPG课程(技术含量:初中级):A:《MMOARPG地下守护神_单机版实战视频课程(上部)》https://edu.csdn.net/course/detail/24965B:《MMOARPG地下守护神_单机版实战视频课程(中部)》https://edu.csdn.net/course/detail/24968C:《MMOARPG地下守护神_单机版实战视频课程(下部)》https://edu.csdn.net/course/detail/24979
主题:程序的扩展性(BPL+
DLL
)
主题:程序的扩展性(BPL+
DLL
) 主题:程序的扩展性(BPL+
DLL
)时间:星期一下午(2004-11-22 15:00)主持:A1 / A3 关联A3的Demo: http://www.hnyyzy.com/myweb/dksoft/
DLL
_BPL.rar 2004-11-22 15:06:45 A1.Aleyn.wu(45198124)今天的主题:利用BPL+
DLL
扩展程序...
CSDN回帖得分大全(近两年)
√vs2005
调用
dll
的时候Initialize()函数返回错误 [VC/MFC 基础类] 40 ylongwu 05-21 20:486 ylongwu06-28 13:42管理√为什么我创建登陆框之后,然后获取登陆框的数据时候总是出现非法操作! [VC/MFC 界面] 40 chencheng8095 05-23 00:2911 xianglitian06-10 11:51管理√CFileFind::FindFile 支持通配符么? [VC/MFC 基础类] 100 wysbk002 05-22
UI和其他
小问题,关于树控件,选中的问题?就是怎么得到当前选中项怎样在标题栏上添加自己的button或其他控件
请问
显示桌面按钮触发的Windows消息是什么?哪位有像Windows2000任务管理器中性能的那个曲线图的源代码。控件中如何使用双缓存?怎么把ShockWaveFlash控件上发生的鼠标右键捕获,并替换成鼠标左键事件?用C++AndAPI写对话框程序
请问
:如何使
MDI
程序一次只打开一种文档?有没有
主题:程序的扩展性(第二节:如何扩展), 时间:2004-12-10 03:00 PM
图一 图二 图三 主题:程序的扩展性(第二节:如何扩展) 时间:2004-12-10 03:00 PM 2004-12-10 15:00:03 A1.Aleyn.wu(45198124) 先提问,写过
DLL
的有几个。 2004-12-10 15:00:21 A1.Aleyn.wu(45198124) 写过COM...
Delphi
5,388
社区成员
262,730
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章