由于项目比较大,所以用了主程序加包的方式开发,也就是把业务窗体写在运行期包(runtime)里,然后主程序通过LoadPackage调用包里的接口函数,并将该窗体实例化后内嵌到主程序的Panel控件上,但是多次尝试总是不成功,主要问题出在内嵌上,请问大家通常是怎么解决此类内嵌问题的?希望给个思路,百分感谢(想万分感谢来着,可惜CSDN一次只让给100分)。
注:主程序内的窗体内嵌没有问题,主程序调用包窗体并show出来也没有问题,就是内嵌报错。

解决方案 »

  1.   

    测试发现运行期包里的Application实例和主程序的Application实例句柄不同,应该不是同一个实例,和win32的DLL类似,是否与此有关?
      

  2.   

    俺是用的Frame单元加载的时候注册一下类
    主程序里加载包
    然后动态创建对象
    设置Parent属性
    呵呵!
      

  3.   

    包和主程序的Application对象是一直的,是不是你设置父窗体的代码有问题,贴出来看看。
      

  4.   

    initialization
      RegisterClass(TFrame2);
    finalization
      UnRegisterClass(TFrame2);-------------------------------------  tmpFrame := TFrame(FindClass('TFrame2')).Create(Self);
      tmpFrame.Parent := pnl1;
      

  5.   


    var
      Style:DWORD;
    begin
      Style:=GetWindowLong(HFrom,GWL_STYLE);
      Style:=Style and WS_CHILD;
      SetWindowLong (HFrom, GWL_STYLE, Style);
      SetWindowPos (HFrom, HWND_TOP, 0, 0, 1, 1, SWP_NOSIZE);
      Windows.SetParent(HFrom,ParentPanel.Handle);
      ShowWindow(HFrom,SW_SHOW);这个是我的
    HForm是要显示的窗口句柄  ParentPanel 是要显示到的Panel
      

  6.   


    我按照你的代码测试了一下,类注册没问题,也能找到该类(showmessage(findclass('TFrame2').ClassName)),但是执行
    tmpFrame := TFrame(FindClass('TFrame2')).Create(Self);
    这句出异常,请问是何缘故?
      

  7.   

    bpl是共享同一空间的vcl资源。所以app应该是同一个。你最好自己trace代码,在出错的地方,检查各个对象的状态是否正确....
      

  8.   

    type
    TframeClass = class of TFrame ;
    ……
    tmpFrame := TframeClass(FindClass('TFrame2')).Create(Self);
    不好意思!
    呵呵!
    再试一下!
    应该可以的!
    我这里运行没有问题!
    需要的话源码发给你!