我一共有三个窗体FORM1,FORM2,FORM3。
form1是主窗体,
form2是登陆窗体,
form3是form1的一个子窗体。
我的要求是 在打开主窗体之前先打开登录窗体,然后在点button1以后,登陆窗体隐藏,主窗体打开,
最后在窗体的菜单点击asdf1Click按钮他就打开form3这个子窗体。
代码如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
application.CreateForm(Tform2,form2);
form2.show;
end;procedure TForm2.Button1Click(Sender: TObject);
begin
   form2.hide;
   application.CreateForm(Tform1,form1);
   form1.Show;
end;procedure TForm1.asdf1Click(Sender: TObject);
begin
application.CreateForm(Tform3,form3);
form3.show;
end;最后在点击菜单asdf1Click按钮时候报错,提示 can not create form,no mdi forms are currently active
project options中已经把主窗体form2,form3调到右边来,
各位大哥帮帮忙有点急。谢谢了

解决方案 »

  1.   

    application.CreateForm(Tform1,form1); 
    写这句话之前,是不是应该判断一下form1是不是已经创建?一般程序登录可以这样实现:
    1、在form2中写一个全局函数Login:Boolean;返回是不是可以登录。
    2、在工程代码中调用Login,如果返回True,再创建Form1.如果form1、form3是MDI窗体,应该把form1的formstyle设置成frmMDIForm、把form3的formstyle设置成frmMDIChild。
      

  2.   

    回答你第一句话,应该不用。应该我写在form1的create事件中的,就是说在创建form1时候,先创建登录窗体FORM2。
    还有那个formstyle已经调成formmdiform,formmdichild了。
      

  3.   

    打开工程属性,ctrl+shift+f11
    把Auto-creates中的form3移除。
      

  4.   

    formmdiform,formmdichild,与窗口的父子关系毫无联系,楼主想象力真丰富!
      

  5.   

    这是主窗体创建的问题,你和delphi MDI的例子对比一下看看,好像是要把主窗体最先创建
      

  6.   

    给你一个思路吧:
    登录窗体先显示,登录后显示主窗体用两个窗口举例如下:
    FORM1是主窗体,FORM2是动态生成的登陆窗体(project - > options中的forms页面,把form2从左边拖到右边去),form2上面有两个按钮,一个是登陆,一个是取消,对应代码分别如下:form2的代码:unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm2 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        {   Private   declarations   }
      public
        {   Public   declarations   }
      end;var
      Form2: TForm2;implementation{$R   *.dfm}procedure TForm2.Button1Click(Sender: TObject);
    begin
      ModalResult := mrOk;
    end;procedure TForm2.Button2Click(Sender: TObject);
    begin
      ModalResult := mrCancel;
    end;end.然后在工程文件中,默认为project1.pas, 代码如下:program Project1;uses
      Forms,
      Controls,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Form2};{$R   *.res}begin
      Application.Initialize;
      Form2 := TForm2.Create(nil);
      try
        if Form2.ShowModal = mrOk then begin
          Application.CreateForm(TForm1, Form1);
          Application.Run;
        end;
      finally
        Form2.Free;
      end;
    end.运行,查看效果,会发现程序先出现的是form2,当点击了登陆按钮,可以显示主窗体,否则程序结束。至于你说的数据连接窗口,同样的方法,自己编码控制吧。
      

  7.   

    详细情况请看, http://blog.csdn.net/GRANDTREE/archive/2009/06/08/4252248.aspx 
      

  8.   

    我现在的就是登陆窗体先显示好吗,你不清楚不要随便说人家思路有问题。
    还有我本来就是动态窗体调用的,已经将PROJECT OPTION中的from2和form3调到右边了
      

  9.   

    可能是我没有说清楚,我说的是MDI窗体问题,不是父子窗体问题,不好意思
      

  10.   

    报错是因为程序一开始先创建了主窗体,然后才是登录窗体
    你把登录窗体设为主窗体,然后把FORM1移出去,应该就可以了