在使用包的时候的一些问题

Strafer_Y 2010-08-26 12:28:03
我写了一个bpl,在这个包里只有一个TForm2的类,如果我加载包之后用showModal显示form可以在showModal之后用UnLoadPackage卸载。如果我用show显示form那么我应该把包的卸载过程写到哪,在什么时候卸载?
...全文
118 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamduo 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 strafer_y 的回复:]
不好意思,我错了。包能卸载,可还是有一些资源没有释放掉。我在form2的CloseQuery是设置action := caFree是不是能释放掉资源?
[/Quote]

可以。
一样的做法是在释放调用的地方,FreeAndNil(form2);
然后说明一下,如果此包中含有一些全局变量什么的,建议在Initialization初始化,
在finalization释放一下。
Strafer_Y 2010-09-02
  • 打赏
  • 举报
回复
不好意思,我错了。包能卸载,可还是有一些资源没有释放掉。我在form2的CloseQuery是设置action := caFree是不是能释放掉资源?
Strafer_Y 2010-09-02
  • 打赏
  • 举报
回复
我在主窗口中把loadpackage的返回值保存到TMsg的lParam中,把TMsg传到bpl中的form2中,我也重写了form2的destroy方法加了PostMessage()在主窗口中查看了一下重新传回来的TMsg中的lParam属性值和LoadPackage的返回值一样,然后我用UnLoadPackage可就是不卸载包所占的资源。
Strafer_Y 2010-09-02
  • 打赏
  • 举报
回复
大家说的我基本上都明白了,谢谢大家
wxieyang 2010-09-02
  • 打赏
  • 举报
回复
资源释放被释放,取决于你在包中都加载了什么资源,有些资源是属于进程的,不会随着包的释放而释放。
如果你要释放资源,那就需要自己看看在包中你都创建了什么资源,如果包释放了就没有用了,那就在FormClose中或者finalization中释放掉
Strafer_Y 2010-09-01
  • 打赏
  • 举报
回复
机器的配置不是很好,如果bpl太多了的话。加载那么多的bpl内存消耗太多了。我在bpl里只有一个form,所以我想在form用完之后就把bpl给卸载。我也在Form的CloseQuery事件里去写UnLoadPackage不行。
wxieyang 2010-09-01
  • 打赏
  • 举报
回复
加载包的时候,传给包一个接受消息的句柄(比如,主窗体的句柄)
如果你的tform2是包中最后一个被释放的窗体,那么再TForm2中重载Destroy方法

destructor Destroy; override;


destructor TForm2.Destroy;
begin
inherited;
//看好了,是在inherited;之后调用,并且是PostMessage方法
PostMessage(MainHwnd, WM_USER + 1234, 0, 1);
end;

这是向主窗体发送消息,通知主窗体自己已经将资源释放完毕了。

在主窗体中,加入相应WM_USER + 1234的处理过程,在判断lParam 是1的时候,表示包中的窗体已经关闭了
调用一下,调用UnLoadPackage卸载包。

在传递消息的时候,可以附带着相关的信息,比如包的编号等,通过编号,你可以在主窗体中知道该释放哪个包。
iamduo 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 strafer_y 的回复:]
这个问题没有人能帮帮我吗?好几天了。真不知道如何解决
[/Quote]

请 look #1 #2 的回答

我的疑问是,你为什么一定要 UnLoadPackage?放着好了,程序结束的时候,自己会回收的。
Strafer_Y 2010-08-28
  • 打赏
  • 举报
回复
这个问题没有人能帮帮我吗?好几天了。真不知道如何解决
Strafer_Y 2010-08-27
  • 打赏
  • 举报
回复
var
pModule : HModule;
aClass : TPersistentClass;
begin
result := nil;
pModule := LoadPackage(bplFile);
if pModule <> 0 then begin
try
aClass := GetClass(className);
if Assigned(aClass) then begin
with TComponentClass(aClass).create(application) as TCustomForm do begin
showModal;
//show;
end;
end else begin
showMessage('组件没有找到');
end;
finally
UnloadPackage(pModule);
end;
end else begin
showMessage('不支持此功能模块');
end;
end;
如果是showModal卸载就很容易,如果是show的话UnLoadPackage()这一行应该放到哪。很郁闷啊!!!!
亮剑_ 2010-08-26
  • 打赏
  • 举报
回复
不会再用到此Form时Unload,或在程序退出前统一Unload
modney 2010-08-26
  • 打赏
  • 举报
回复
没试过show,包应该只有showmodal吧
kye_jufei 2010-08-26
  • 打赏
  • 举报
回复
如果說不會再用到FORM,那麼直接UNLOAD,或在程序的CloseQuery事件中去執行UNLOAD...

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧