我写了一个bpl,在这个包里只有一个TForm2的类,如果我加载包之后用showModal显示form可以在showModal之后用UnLoadPackage卸载。如果我用show显示form那么我应该把包的卸载过程写到哪,在什么时候卸载?

解决方案 »

  1.   

    不会再用到此Form时Unload,或在程序退出前统一Unload
      

  2.   

    如果說不會再用到FORM,那麼直接UNLOAD,或在程序的CloseQuery事件中去執行UNLOAD...
      

  3.   

    没试过show,包应该只有showmodal吧
      

  4.   

    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()这一行应该放到哪。很郁闷啊!!!!
      

  5.   


    请 look #1 #2 的回答我的疑问是,你为什么一定要 UnLoadPackage?放着好了,程序结束的时候,自己会回收的。
      

  6.   

    机器的配置不是很好,如果bpl太多了的话。加载那么多的bpl内存消耗太多了。我在bpl里只有一个form,所以我想在form用完之后就把bpl给卸载。我也在Form的CloseQuery事件里去写UnLoadPackage不行。
      

  7.   

    加载包的时候,传给包一个接受消息的句柄(比如,主窗体的句柄)
    如果你的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卸载包。在传递消息的时候,可以附带着相关的信息,比如包的编号等,通过编号,你可以在主窗体中知道该释放哪个包。
      

  8.   

    我在主窗口中把loadpackage的返回值保存到TMsg的lParam中,把TMsg传到bpl中的form2中,我也重写了form2的destroy方法加了PostMessage()在主窗口中查看了一下重新传回来的TMsg中的lParam属性值和LoadPackage的返回值一样,然后我用UnLoadPackage可就是不卸载包所占的资源。
      

  9.   

    不好意思,我错了。包能卸载,可还是有一些资源没有释放掉。我在form2的CloseQuery是设置action := caFree是不是能释放掉资源?
      

  10.   


    可以。
    一样的做法是在释放调用的地方,FreeAndNil(form2);
    然后说明一下,如果此包中含有一些全局变量什么的,建议在Initialization初始化,
    在finalization释放一下。
      

  11.   

    资源释放被释放,取决于你在包中都加载了什么资源,有些资源是属于进程的,不会随着包的释放而释放。
    如果你要释放资源,那就需要自己看看在包中你都创建了什么资源,如果包释放了就没有用了,那就在FormClose中或者finalization中释放掉