主窗体(FORMSTYLE=FSMDIFORM),调用DLL子窗体的时候,只要把它的FORMSTYLE设置为FSMDICHILD,调用的时候就出现cannot create form,No MDI Forms are currently active;
说什么就是找不到主窗体,设置成FSNORMAL,就能正常调用,各位大虾们有没有高招指点一下?
怎么样才能调用DLL子窗体而且另调用它的窗体与之建立父子关系,谢谢!

解决方案 »

  1.   

    你要在dll里,在开始时
    Application := AApp;
    AApp时传递过来的exe的application。
      

  2.   

    我已经传递到DLL里面了,说实话, 我不是十分明白为什么这样!看起来应该没什么问题,但是。。各位支下招吧!感谢感谢,我刚注册的ID,分不多,以后多了一定多放分!
    我的代码是这样的:
    function ShowUserForm(aHandle:THandle;aCaption:PChar):boolean;stdcall;
    begin
      Application.Handle:=aHandle;
      try
        UserForm:=TUserForm.Create(Application);
        UserForm.Show;
        UserForm.Caption:=aCaption;
      except
        UserForm.free;
      end;
      Result:=true;
    end;需要那里加点什么吗?!
      

  3.   

    把Screen也传进去,建议不要用dll做窗体,尤其是MDI,有你罪受的,
    因为exe和dll在分别两块地址段中,
    比如exe里用了forms单元,dll里也用了forms单元,
    exe里的application和dll里的application是不同的对象.
    所以forms单元里的公共变量都要传过去,而且释放dll的时候
    application要还原,否则exe里的application就丢失了.
    做MDI的时候问题还远不止这些,不伦是否创建了子窗体,
    你会发现ActiveMDIChild永远为空.如果非要这样,最好使用带包编译.
      

  4.   

    不是application.handle
    是application
      

  5.   

    function ShowUserForm(AApp:TApplication;aCaption:PChar):boolean;stdcall;
    begin
      Application.:=AApp;
      try
        UserForm:=TUserForm.Create(Application);
        UserForm.Show;
        UserForm.Caption:=aCaption;
      except
        UserForm.free;
      end;
      Result:=true;
    end;
      

  6.   

    试试如下代码,没有问题的,我就是用这种方法,注意dll中的窗体要设置为FSMDICHILDfunction ShowForm(mainForm:TForm):integer;stdcall
      var
      Form1: TForm1;
      ptr:PLongInt;
      begin
      ptr:=@(Application.MainForm);//先把dll的MainForm句柄保存起来,也无须释放,只不过是替换一下
      ptr^:=LongInt(mainForm);//用主调程序的mainForm替换DLL的MainForm。MainForm是特殊的WINDOW,它专门管理Application中的Forms资源.
      //为什么不直接Application.MainForm := mainForm,因为Application.MainForm是只读属性
      Form1:=TForm1.Create(mainForm);//用参数建立
      end; 
      备注:参数是主调程序的Application.MainForm