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()这一行应该放到哪。很郁闷啊!!!!
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()这一行应该放到哪。很郁闷啊!!!!
请 look #1 #2 的回答我的疑问是,你为什么一定要 UnLoadPackage?放着好了,程序结束的时候,自己会回收的。
如果你的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卸载包。在传递消息的时候,可以附带着相关的信息,比如包的编号等,通过编号,你可以在主窗体中知道该释放哪个包。
可以。
一样的做法是在释放调用的地方,FreeAndNil(form2);
然后说明一下,如果此包中含有一些全局变量什么的,建议在Initialization初始化,
在finalization释放一下。
如果你要释放资源,那就需要自己看看在包中你都创建了什么资源,如果包释放了就没有用了,那就在FormClose中或者finalization中释放掉