在做MDI应用程序时,我将MDI的主窗体和子窗体都放入了一个DLL文件中,
但当创建子窗体时却报错:can not create form. no mdi forms are currently active.
仔细分析后,原因是MDI主窗口不是作为Application的MainForm,
但我确实必须将MDI的主窗体和子窗体都放入DLL,以便其它应用系统调用。
请问各位能否帮我解决这个难题?很急!先谢谢了!

解决方案 »

  1.   

    一般是这样,也可以把一个引用该MDI主窗体的窗体或者单元作为application的主窗体,但这个Application主窗体不能是该MDI主窗体的子窗体(MDIChild)
      

  2.   

    to fyje:
    不行啊,就是因为引用MDI主窗体的的窗体是Application的主窗体才会有这个问题的。我想问题或许有以下两个解决的方法:
    1.想方设法把MDI的主窗体转换成Application的主窗体
    2.是不是可以用API和消息自己制作MDI应用程序,不用Delphi的FormStyle设置?这样MDI子窗体就不会只去找Application的主窗体了?以上两种方式可行吗?如果可行能否给个示例?
      

  3.   

    楼上的兄弟,可以说详细些么
    —————————————————————————————————
    ┏━★━━◆━━★━┓ 
    ♂欢|◢CSDN◣|使♂        ▲自由保存帖子,浏览,关注检测
    ┃迎|◥论坛助手◤|用┃        ▲完善的CSDN客户端工具
    ┗━☆━━◇━━━☆┛       ▲自动添加签名......让你更快,更爽,更方便地上CSDN...
    http://www.csdn.net/expert/topic/573/573604.xml
    http://www.chinaok.net/csdn/csdn.zip
      

  4.   

    要有一个fsMDIForm,其它都是fsMDIChild
      

  5.   

    我在MDI主窗口不是作为Application的MainForm
    显示子窗体procedure TMainFrm.B2Click(Sender: TObject);
    var  pHandle:^THandle;
    begin
       pHandle :[email protected];
         pHandle^:=ClientHandle; ///关键在这一句!
        with TFsq.Create(Application) do show;end;
      

  6.   

    好几天没看这个帖子,居然有这么多人回,谢谢了to king_017:
    你真是高手,我新建了个工程,果然可以调用MDI子窗体了。
    但是我的问题你解决了一半:
    现在我是把MDI的父窗体和子窗体都放在了一个DLL中,
    由外部调用者首先调用MDI父窗体,
    而DLL中的Application.MainForm实际上是等于nil :(
    所以执行到pHandle^:=ClientHandle; 时就出现了访问错误了请问该如何解决MDI主窗体在DLL中这个问题呢?希望你能够再次解答,不过就算无法解决也会给分的,谢谢
      

  7.   

    我刚才又试了一下,把Application传过去倒是可以解决这个问题,
    不过千万别告诉我这样解决,我可不想这么做,
    因为调用者有可能不是Delphi开发的模块。
      

  8.   

    关键在于dll端,原因在于Application.Handle为nil
    在dll端应该一个函数
    procedure Show(MainHwnd : HWND);//
    begin
      Application.Handle := MainHwnd;//MainHwnd是调用端Application.Handle;
      //然后以下是建立窗口的事了
    end;
      

  9.   

    to chinamo:
    这一步是肯定要做的,但解决不了MDI的问题
      

  10.   

    问题我已经解决了!
    方法是用MDI主窗体去接管Application的主窗体就可以了。
    这个方法还是受到了king_017的启发,所以给你加上分。