程序流程:当datamodule中的adoconnection连接数据库成功时->创建登陆窗体,然后登陆成功时->创建主窗体:然后在主窗体中调用MDIchild窗体,此时会出现错误
(cannot creat form. No MDI forms are currently active)
我查一些资料,听说是delphi程序会把第一个创建的窗体设置为主窗体,不知道各位达人有什么好方法没???
==================
程序代码:
program DesSys;
uses
  Forms,
  UnMain in 'UnMain.pas' {frMain},
  UnMingxi in 'UnMingxi.pas' {frMingxi},
  UnAbout in 'UnAbout.pas' {frAbout},
  UnZuli in 'UnZuli.pas' {frZuli},
  Unlogin in 'Unlogin.pas' {frLogin},
  UnData in 'UnData.pas' {DataModule1: TDataModule},
  UnPublicInfo in '..\public\UnPublicInfo.pas';{$R *.res}
begin
  Application.Initialize;
  Application.Title := 'SYS';
  Application.CreateForm(TDataModule1, DataModule1);
  Application.Run;
end.
============================================================procedure TDataModule1.DataModuleCreate(Sender: TObject);
var
  sConnect:string;
begin
  sConnect:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;';
  sConnect:=sConnect+'Initial Catalog=mould;Data Source=E-MOD010';
  try
    ADOConnection1.ConnectionString:=sConnect;
    ADOConnection1.Connected:=true;
    adoconnection1.KeepConnection:=true;
    adoconnection1.LoginPrompt:=false;
    Application.CreateForm(TfrLogin, frLogin);
  except
    Application.MessageBox('数据库连接失败!!!','设计课系统',mb_OK+mb_IconStop);
  end;
end;
========================procedure TfrLogin.btnLoginClick(Sender: TObject);
begin
  if checkLogin() then
  begin
    edtPwd.Clear;                              //密码文本框清空
    Application.CreateForm(TfrMain, frMain);  //创建主窗体
    frMain.Show;
    frLogin.Hide;
  end;
end;

解决方案 »

  1.   

    adoconnection1.LoginPrompt:=false;
        Application.CreateForm(TfrLogin, frLogin);改成
    frLogin := TfrLogin.Create(Application);
    frLogin.Show;
      

  2.   

    楼上大哥 谢谢回帖
     我用你的方法试了不行 (login 窗台一闪就消失了)
    ====
    我在云看来的程序中加 showmessage(application.mainform.caption) 才知道原来系统把login窗体作为主窗体了,难怪会有错误 
      高手们宽开帮忙啊!!!
      

  3.   

    adoconnection1.LoginPrompt:=false;
        Application.CreateForm(TfrLogin, frLogin);改成
    frLogin := TfrLogin.Create(Application);
    frLogin.ShowModal;
    就可以了,
    但创建顺序还是先创建主窗体,然后在创建登陆窗体,只不过显示顺序可以控制,LZ不防试下
      

  4.   

    Application.CreateForm(TfrLogin, frLogin); 
    //这里改:
    frLogin := TfrLogin.Create(Application);
    if frLogin.ShowModal = mrOK then
      Application.CreateForm(TfrMain, frMain);
    else Exit;另:
    procedure TfrLogin.btnLoginClick(Sender: TObject);
    begin
      if checkLogin() then
      begin
        edtPwd.Clear;                              //密码文本框清空
        ModalResult := mrOK;
        frLogin.Hide;
      end;
    end;
      

  5.   

    回楼上:用你的这个方法,也是这样的:
    (当登录系统成功时是没有问题,但当登录失败返回一个错误提示时窗体就关闭了,而不能继续输入正确信息) 而且关闭mainform时,会出现错误。
    =================
    这样比较麻烦的话  能给一个别的登录方法也好啊
      

  6.   

    你应该先Application.CreateForm(TfrMain, frMain)....
    然后再frLogin := TfrLogin.Create(Application).....
    最后进行判断。你理清一下自己的逻辑吧。
      

  7.   

    向上数四层, chenzhuo(睡到自然醒) 正解。先创建登陆窗体,在登陆按钮里判断用户身份是否正确,如果不正确就继续要求输入身份信息,超过N次不正确则modalResult<>mrOk,继而退出程序; 如果正确,则ModalResult=mrOK,创建并Show主窗体。
      

  8.   

    哦,没仔细看,chenzhuo(睡到自然醒)的代码应该再改一下,ModalResult应该在连续N次不正确之后,或正确之后再赋值。
      

  9.   

    不好意思哈, 还是没说明白(还是没仔细看上面的代码)给楼主写了代码,请看一下://登陆窗体单元
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TFrm_Login = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Frm_Login: TFrm_Login;implementation{$R *.dfm}
    var
      LoginCount : integer;procedure TFrm_Login.Button1Click(Sender: TObject);
    begin
      if Edit1.Text <> '合法身份' then
        begin
        Inc(LoginCount);
        if LoginCount > 2 then self.ModalResult := mrCancel;
        Edit1.Clear;
        Edit1.SetFocus;
        end
      else
        self.ModalResult := mrOK;
    end;end.
    //主窗体单元
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TFrm_Main = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Frm_Main: TFrm_Main;implementation{$R *.dfm}end.
    ////工程单元
    program Project1;uses
      Forms, windows, Controls,
      Unit1 in 'Unit1.pas' {Frm_Main},
      Unit2 in 'Unit2.pas' {Frm_Login};{$R *.res}begin
      Application.Initialize;
      Frm_Login := TFrm_Login.Create(application);
      try
        Frm_Login.ShowModal;
        if Frm_Login.ModalResult = mrOK then
           Application.CreateForm(TFrm_Main, Frm_Main);
      finally
        Frm_Login.Free;
      end;
      Application.Run;
    end.
      

  10.   

    TO ScriptBaby(Kanna·Naraku)
    "先创建你所期望的主窗体, 然后显示不显示随你便, 然后再创建登录窗体"
    请问怎样不显示主窗体???
    =================================
    lihuasoft(坐井观天) ( ) 信誉:100    
    用你你的方法,发现还是登录一次不成功程序就关闭了,而不是你代码想表示的三次
      

  11.   

    不可能的, 除非这里面if Edit1.Text <> '合法身份' 你修改的代码有误.我是经过测试通过的代码. 你可以完全按我的代码新建一个工程试验一下, 然后再加入到你的程序里去.
      

  12.   

    不知道这样行不行:设置登陆窗体为主窗体,登陆后隐藏登陆主窗体,而动态地创建子窗体,并且显示子窗体。大概也和lihuasoft(坐井观天)差不多,呵呵。
    以下代码中,Form2是子窗体,Form1是主窗体,登陆后隐藏主窗体。
            Form2 :=TForm2.Create(Application); 
            Form2.Show;
            Form1.Hide;在初始化部分中可以省去Form2的创建:
    ////工程单元
    program Project1;
    uses
    Forms, windows, Controls,
    Unit1 in 'Unit1.pas' {Form1},
    Unit2 in 'Unit2.pas' {Form2};
    {$R *.res}
    begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    //Application.CreateForm(TForm2, Form2);
    Application.Run;
    end.
      

  13.   

    Delphi的project文件里第一个创建的可视窗体为主窗体,既然这样我们就在这里写上Application.CreateForm(TFrm_Main,Frm_Main);当然数据模块创建要在前面,把登录的窗体写在Frm_Main的Create事件里,Login窗体单元里写一个函数来把login窗体showmodel出来,主窗体的Create事件里调这个函数就可以.登录成功后把login窗体free掉就可以了.如果登录时背后要显示main窗体,就写在show事件里就可以了.
      

  14.   

    我给你发一个我正在写给我的学妹的程序吧,群里的人提供的ftp资源,地址我发消息给你好了.
      

  15.   

    把主窗体设置为不可见啊... 
    虽然好几年没碰delphi了, 但是这个功能我还是记得的.
      

  16.   

    我是这样设计的,看代码:program ZJCMS;uses
      Forms,
      login in 'login.pas' {Flogin},
      main in 'main.pas' {Fmain},
      xueji in 'xueji.pas' {Fxueji},
      dm in 'dm.pas' {Fdm: TDataModule},
      chaxun in 'chaxun.pas' {Fchaxun},
      xjxg in 'xjxg.pas' {Fxjxg},
      xjzj in 'xjzj.pas' {Fxjzj},
      yearmonth in 'yearmonth.pas' {Fyearmonth},
      PublicProcedure in 'PublicProcedure.pas',
      setzhuanye in 'setzhuanye.pas' {Fsetzhuanye},
      setclass in 'setclass.pas' {Fsetclass},
      rili in 'rili.pas' {Frili},
      weiji in 'weiji.pas' {Fweiji},
      liangcao in 'liangcao.pas' {Fliangcao},
      bedroom in 'bedroom.pas' {Fbedroom},
      fanxiao in 'fanxiao.pas' {FFanxiao},
      plxg in 'plxg.pas' {Fplxg},
      plzj in 'plzj.pas' {Fplzj},
      bed in 'bed.pas' {Fbed},
      dormitory in 'dormitory.pas' {Fdormitory},
      inroom in 'inroom.pas' {Finroom};{$R *.res}begin
      Application.Initialize;
      Flogin:=TFlogin.Create(application);
      flogin.ShowModal;
      flogin.Update;
      if not flogin.ok then
      application.Terminate
      else begin
      Application.Title := '于2006年9月设计';
      Application.CreateForm(TFmain, Fmain);
      Application.CreateForm(TFdm, Fdm);
      Application.CreateForm(TFlogin, Flogin);
      Application.CreateForm(TFinroom, Finroom);
      Application.Run;
      end;
    end.login.pas单元
    unit login;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, bsSkinBoxCtrls, bsSkinCtrls, bsSkinData,
      BusinessSkinForm, DB, DBTables, bsMessages,Inifiles;type
      TFlogin = class(TForm)
        bsSkinButton1: TbsSkinButton;
        bsSkinButton2: TbsSkinButton;
        bsSkinLabel1: TbsSkinLabel;
        bsSkinLabel2: TbsSkinLabel;
        bsSkinPasswordEdit1: TbsSkinPasswordEdit;
        bsSkinComboBox1: TbsSkinComboBox;
        bsSkinData1: TbsSkinData;
        bsCompressedStoredSkin1: TbsCompressedStoredSkin;
        bsBusinessSkinForm1: TbsBusinessSkinForm;
        Table1: TTable;
        bsSkinMessage1: TbsSkinMessage;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure bsSkinButton1Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure bsSkinButton2Click(Sender: TObject);
        procedure bsSkinPasswordEdit1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Private declarations }
      public
        { Public declarations }
        ok:boolean;
        cuser:string;
      end;var
      Flogin: TFlogin;implementation{$R *.dfm}
    uses
    dm;
    procedure TFlogin.FormCreate(Sender: TObject);
    begin
    ok:=false;
    end;procedure TFlogin.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    if not ok then
    application.Terminate;
    end;procedure TFlogin.bsSkinButton1Click(Sender: TObject);
    var
    myini:Tinifile;
    begin
    table1.Open;
    if table1.Locate('user',self.bsSkinComboBox1.Text,[]) then
    begin
    if self.Table1.FieldValues['Pasword']=self.bsSkinPasswordEdit1.Text then
    begin
    ok:=true;
    cuser:=self.bsSkinComboBox1.Text;
    myini:=tinifile.Create(extractfilepath(paramstr(0))+'init.ini');
    myini.WriteString('当前登陆用户','cuser',cuser);
    self.Close;
    end else
    self.bsSkinMessage1.MessageDlg('密码错误!',mtWarning,[mbok],0);
    end else
    begin
    self.bsSkinMessage1.MessageDlg('非法用户!',mtWarning,[mbok],0);
    end;
    end;procedure TFlogin.FormShow(Sender: TObject);
    var
    i:integer;
    begin
    self.Table1.Open;
    self.Table1.First;
    self.bsSkinComboBox1.Items.Clear;
    for i:=0 to table1.RecordCount-1 do
    begin
    self.bsSkinComboBox1.Items.Add(self.Table1.FieldValues['User']);
    self.Table1.Next;
    end;
    self.bsSkinComboBox1.ItemIndex:=0;
    self.Table1.Close;
    self.bsskinpasswordedit1.SetFocus;
    end;procedure TFlogin.bsSkinButton2Click(Sender: TObject);
    begin
    self.close;
    end;procedure TFlogin.bsSkinPasswordEdit1KeyDown(Sender: TObject;
      var Key: Word; Shift: TShiftState);
    begin
    if key=13 then
    self.bsSkinButton1Click(self);
    end;end.