目的:将DLL中的窗体弄到主程序的一个面板中显示
问题如下:
已经在dll中做好窗体了,并且dll中定义函数可以创建并且显示窗体.该函数有个参数是传递主程序的一个面板共dll窗体当
parent.
相关代码如下
DLL中
procedure AAA(AppHandle:HWND;AFrmParent:TPanel;src:TScreen);stdcall;
begin
  Application.Handle := AppHandle;//将主程序句柄传进来
  Screen := src;
  //创建窗体,并显示在指定的Panel上
  Application.CreateForm(TF_A,F_A);
  F_RightControl.Parent := AFrmParent;
  {
   另一种实现方式
   F_A := TF_A.Create(Application);
   F_A.showmodal;
   F_A.Free;
  }
end;上面的代码可以把窗体创建出来,可是主窗口的面板中却看不到窗体,不知道这个DLL窗体到底跑哪去了.
恳请高手赐教.

解决方案 »

  1.   

    不好意思 代码优点乱,重新整理下procedure AAA(AppHandle:HWND;AFrmParent:TPanel;src:TScreen);stdcall;
    begin
      Application.Handle := AppHandle;//将主程序句柄传进来
      Screen := src;
      //创建窗体,并显示在指定的Panel上
      Application.CreateForm(TF_A,F_A);
      F_A.Parent := AFrmParent;
      {
       另一种实现方式
       F_A := TF_A.Create(Application);
       F_A.Parent := AFrmParent;
       F_A.showmodal;
       F_A.Free;
      }
    end;
      

  2.   

    子窗体要最大化,建议你在form中先实现了,再向DLL封装转变
      

  3.   

    你应该这样 :
       F_A := TF_A.Create(nil);
       F_A.showmodal;
       F_A.Free;
    就可以了
      

  4.   

    没有DLL之前已近搞定,就是在一个工程中建两个窗体,from1和form2可以将form2放到form1的一个面板中,但是将form2封装到DLL中就不行了,不知道为什么.
      

  5.   

    你可以在DLL子程序中,把主程序名或HANDLE传进去.在打开的时候,就把子程序的父母定义为主程序中的一个页面为其它容器.
    =================================
    另一种,就是二边都设计好后,在主程序中,打开一个DLL子FORM,然子程序名或HANDLE传过来.把他加入到其它相应的容器里面去.
      

  6.   

    我想到的思路有两种:
    一,通过函数将DLL中创建的窗体对象引出到主程序中,然后在设置这个窗体的Parent属性
    二.将主程序中的一个parent组件(比如Panel)通过函数传递到DLL中然后在DLL中创建窗体,设置parent属性
    可是遗憾的是这两种方法都不能达到目的.
    窗体是可以创建出来的,但是显示不出来,目标面板中看不到窗体.不知什么原因,高手赐教啊.
      

  7.   

    我给你个思路吧,把DLL中改写一下,不是把主程序的句柄传进去,而是用
    function openForm(FormName:String):TForm ;
    把创建的Form返回来,然后把你这个Form搞到你的panel上,Dock上去就可以了
      

  8.   

    这个思路我用过,只是得到DLL窗体后直接设置parent了,没有Dock,我来试试,谢谢啊
      

  9.   

    传FORM或传FORM句柄能解决的啊.我做的MDI,子FORM都是DLL里面的.调用都正常. 只要MDI中能调用到,应该也能加到主界面的如PAGECONTROL控件上面的啊
      

  10.   

    你有沒有裝載dll,用loadlibrary再用getprocaddress得到函數地址再用
      

  11.   

    http://www.namipan.com/d/784635fa7a247e32018c7cf91c19d635718ec96fdc6d0000
    这是代码和程序,楼主下载试试看,是不是你想要的
      

  12.   

    http://www.namipan.com/d/784635fa7a247e32018c7cf91c19d635718ec96fdc6d0000 
    这里的代码太神奇了.
    我按照里面的代码即使是复制一遍也不能实现预期功能,主要DLL窗体放到面板后就不见了,试了好久都搞不定.
    真是不可思议,而且里面的DLL文件也很特别,我复制源码做了一个DLL用不同名字命名后,给它的主程序调用,
    也出现了同样的问题(窗体放到面板后只是一闪,然后就不见了).
    不知道是这个代码里面隐藏着什么高深的地方我没有发现,还是我的系统有问题.
    希望高手研究下
      

  13.   

    关键在:EXE与DLL都带VCL包编译
    操作步骤如下:Project-->Options-->Packages-->把“Build with runtime packages”前面打勾,在下面输入“vcl”-->确定-->编译希望楼主到这帖可以结帖给分
      

  14.   

    哈哈 你太有才了,结帖给分.
    还想问最后一个问题,这样做(EXE与DLL都带VCL包编译)的理由是什么,为什么会出现这么大差别.