我做了个小系统,主窗体是MDI窗体,其他窗体均为普通窗体,不知道怎么回事每次启动时要启动半天,而且所有的窗体都创建并且打开了,好郁闷.我想在程序启动时只启动主窗体,其他窗体在应用程序调用时才执行,请问这种问题应当如何解决?高手请帮帮忙,谢了!

解决方案 »

  1.   

    Project -> Options -> Forms 把Auto-Create Forms里面的MDI窗体放到Available Forms里面去。
    然后你的MDI需要在程序中自己去创建和显示
      

  2.   

    或在dpr文件,将begin end里的创建其他窗口的代码删除
      

  3.   

    使用时,用语句建立窗体:
    var
      child:tmdichild;
    begin
      child:=tmdichild.create(application);
    end;
      

  4.   

    为什么我把其他窗体设置为MDI子窗体时,程序启动后,子窗体就关不掉了啊?
      

  5.   

    在了窗体的formclose事件中加入:
    action:=cafree;
      

  6.   

    在了窗体的onclose事件中加入:
    action:=cafree;
      

  7.   

    感谢以上回复者,但是有一个问题没有解决,就是我的非MDI子窗体还是在程序启动时全部启动起来了,请问是否也应该把普通窗体按照"Project -> Options -> Forms 把Auto-Create Forms里面的普通窗体放到Available Forms里面去。",然后在调用时手工创建吗?请回复者写清详细步骤,谢谢了!
      

  8.   

    "chinaandys(天煞孤星&&降龙十八炒) ",我按照你的方法做了,可以,但是在退出窗口时为什么要电击两次才能退出啊
      

  9.   

    MDI和非MDI的重建方法是一样的.
    FormN := TFormN.Create(self);
    FormN.Show;
    不同是地方是MDI窗体在关闭的时候要在OnClose中加:
    Action := caFree;{其默认的是caMinimize}
      

  10.   

    var
      Form2: TForm2;implementation{$R *.dfm}procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    action:=cafree;
    end;procedure TForm2.FormDestroy(Sender: TObject);
    begin
    form2:=nil;
    end;
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin    form2:=Tform2.create(self);        form2.Show;end;
      

  12.   

    我编的一个简单的MDI子窗体按上面方法创建可以,而且速度很快,但关要关两次.但是复杂一点的MDI子窗体,比如窗体上有数据库控件,就要创建半天,而且创建后的窗体不能使用,请问这是怎么回事啊
      

  13.   

    调用时创建窗体原码: 
    Application.CreateForm(TFrmLogin, FrmLogin);
     FrmLogin:=TFrmLogin.Create(nil);所创建的窗体各事件如下;
    unit Login;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,Flash, DB, ADODB, ExtCtrls,Main, Mask, DBCtrls, Grids,StudentInfo,
      DBGrids;type
      TFrmLogin = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        BtnLogin: TButton;
        BtnCancel: TButton;
        EditPassword: TEdit;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
        CmbUser: TComboBox;
        procedure BtnCancelClick(Sender: TObject);
        procedure BtnLoginClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure CmbUserKeyPress(Sender: TObject; var Key: Char);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);  private
        { Private declarations }
      public
        { Public declarations }
      end;var
      FrmLogin: TFrmLogin;implementation{$R *.dfm}procedure TFrmLogin.BtnCancelClick(Sender: TObject);
    begin
      close;
    end;procedure TFrmLogin.BtnLoginClick(Sender: TObject);
    begin
      if CmbUser.Text='' then
        begin
          showmessage('用户名不能为空,请输入用户名!');
          CmbUser.SetFocus;
          CmbUser.SelectAll;
        end
      else if EditPassword.Text='' then
        begin
          showmessage('密码不能为空,请输入密码');
          EditPassword.SetFocus;
          EditPassword.SelectAll;
        end
      else
        begin
          with FrmLogin.ADOQuery1 do
           begin
            close;
            SQL.Clear;
            sql.Add('select * from sys_user where 用户名="'+trim(CmbUser.Text)+'"');
            open;
            if Recordset.RecordCount<=0 then
              begin
                showmessage('此用户名不存在,请重新输入!');
                CmbUser.SetFocus;
                Cmbuser.SelectAll;
              end
            else if ADOQuery1.fieldByName('密码').AsString<>trim(EditPassword.Text) then
              begin
                showmessage('密码错误,请重新输入!');
                EditPassword.SetFocus;
                EditPassword.SelectAll;
              end
            else
              begin
                if ADOQuery1.FieldByName('用户类型').AsString='管理员' then
                  begin
                    with frmMain do
                      begin
                        QXSZ.Enabled:=true;
                        DLXT.Enabled:=false;
                        ZXDL.Enabled:=true;
                        XGMM.Enabled:=true;
                        FPYH.Enabled:=true;
                        GLY.Enabled:=true;
                        XSXXWH.Enabled:=true;
                        XSXXCX.Enabled:=true;
                        TBQXSZ.Enabled:=true;
                        TBDLXT.Enabled:=false;
                        TBZXDL.Enabled:=true;
                        TBXGMM.Enabled:=true;
                        TBFPYH.Enabled:=true;
                        TBGLY.Enabled:=true;
                        TBXSXXWH.Enabled:=true;
                        TBXSXXCX.Enabled:=true;
                      end;
                  end
                else
                  begin
                    with frmMain do
                      begin
                        QXSZ.Enabled:=false;
                        DLXT.Enabled:=false;
                        ZXDL.Enabled:=true;
                        XGMM.Enabled:=true;
                        FPYH.Enabled:=false;
                        GLY.Enabled:=false;
                        XSXXWH.Enabled:=true;
                        XSXXCX.Enabled:=true;
                        TBQXSZ.Enabled:=false;
                        TBDLXT.Enabled:=false;
                        TBZXDL.Enabled:=true;
                        TBXGMM.Enabled:=true;
                        TBFPYH.Enabled:=false;
                        TBGLY.Enabled:=false;
                        TBXSXXWH.Enabled:=true;
                        TBXSXXCX.Enabled:=true;
                      end;
                  end;
                login_user:=FieldByName('用户名').AsString;
                login_password:=FieldByName('密码').AsString;
                login_usertype:=FieldByName('用户类型').AsString;
                pr_view:=FieldByName('查看').Value;
                pr_add:=FieldByName('增加').Value;
                pr_edit:=FieldByName('编辑').Value;
                pr_delete:=FieldByName('删除').Value;
                showmessage('登录成功!');
                frmLogin.Close;
              end;
            close;
          end;    end;
    end;procedure TFrmLogin.FormCreate(Sender: TObject);
    var i:integer;
    begin
      FrmLogin.Width:=256;
      FrmLogin.Height:=166;
      ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=.\SMS.mdb;';
      ADOQuery1.Active:=true;
      with ADOQuery1 do
        begin
          close;
          SQL.Clear;
          SQL.Add('select * from sys_user');
          open;
          for i:=1 to Recordset.RecordCount do
            begin
              FrmLogin.CmbUser.AddItem(FieldByName('用户名').AsString,FieldByName('用户名')); 
              Recordset.MoveNext;
              Refresh;
            end;
        end;
    end;
    procedure TFrmLogin.CmbUserKeyPress(Sender: TObject; var Key: Char);
    begin
      if (key=#13) then
        begin
          Perform(WM_NEXTDLGCTL,0,0);
        end;
    end;procedure TFrmLogin.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      //action:=cafree;
    end;end.
      

  14.   

    Application.CreateForm(TFrmLogin, FrmLogin);   //新建第一次
     FrmLogin:=TFrmLogin.Create(nil);             //新建第二次
      

  15.   

    去掉第一个Application.CreateForm(TFrmLogin, FrmLogin);