一个登录窗体,一个MDI主窗体,设置了MDI主窗体为主窗体,然后在主窗体的SHOW事件中
procedure Tfrm_main.FormShow(Sender: TObject);
begin
frm_login.ShowModal ;
statusbar1.Panels[1].Text :='操作员:['+user_id+']';
end;
先显示登录窗体。登录窗体确定按纽代码:
procedure Tfrm_login.BitBtn1Click(Sender: TObject);
var sqlstr:string ;
begin
sqlstr:='select * from users where id='''+edit1.text+''' and pwd='''+edit2.text+'''';
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(sqlstr);
adoquery1.Open ;
if adoquery1.RecordCount <>0 then
begin
user_id:=edit1.text;
frm_main.Show ;
frm_login.Close ;
end else
begin
showmessage('用户名或密码错误,请重新输入。');
edit1.clear;
edit2.clear;
edit1.SetFocus ;
end;
end;
发现一个问题密码录入错误,执行了到showmessage那步,登录窗体显示一个对话框“用户名或密码错误,请重新输入。”后,直接进入显示主窗体了,哪位高手能指导下不,密码错误应当执行用户名得到焦点并继续,

解决方案 »

  1.   

    1、应该设置登录窗口frm_login为主窗体;用户及密码正确,进入MDI窗体;否则一直留在登录窗体(主窗体)。
    2、经查看其它代码基本无错。只要在IED是,重新设置主窗体即可。
      

  2.   

    我也是跟你一样,将登录窗口设成子窗口的。我定义了一个全局变量   IsLogon(是否登录成功) ,  IsFristLogon (是否第一次登录,或者系统已经注销) 在主窗口中, 初始化 IsLogon 为 false
    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
         IsLogon := false ;
         IsFristLogon  := true;
    end;procedure TfrmMain.FormActivate(Sender: TObject);
    begin
        if  not  IsFristLogon  then 
        begin
               Exit;
        end;
        frmLogonSys := TfrmLogonSys.Create(Application);
        frmLogonSys.Position := poMainFormCenter ;
        frmLogonSys.ShowModal ;
        if IsLogon then   //登录成功
        begin
            IsFristLogon := False ;
            //do something.....
        end
        else
        begin                  //登录失败,关闭主窗体
          postmessage(frmMain.handle, WM_CLOSE, 0, 0);    //好像在 FormShow 里面, 执行 postmessage 会出错。所以我登录放在  FormActivate 响应了。
        end;
    end;//  frmLogonSys (登录框主要内容)
    将登录判断放到 frmLogonSys 窗体里面做。 只返回 IsLogon 的值就OK了。//点击登录按钮函数。
    procedure TfrmLogonSys.btnLogonClick(Sender: TObject);
    begin
     var sqlstr:string ;
    begin
    sqlstr:='select * from users where id='''+edit1.text+''' and pwd='''+edit2.text+'''';
    adoquery1.Close;
    adoquery1.SQL.Clear;
    adoquery1.SQL.Add(sqlstr);
    adoquery1.Open ;
    if adoquery1.RecordCount <>0 then
    begin   //登录成功
          IsLogon := true;
          //保存登录用户等信息到全局变量, 供系统运行时操作日志等用
          frmLogonSys.ModalResult := mrOK ;
          frmLogonSys.Close ;
    end 
    else
    begin //登录失败。
        sysCtrl.IsLogon := False ;
        Showmessage('Logon system failture: User name or password error.');
        edtRdId.SetFocus ;
    end;//点击了退出按钮
    procedure TfrmLogonSys.btnExitClick(Sender: TObject);
    begin
      if MessageDlg('Are you sure exit? ',mtConfirmation, [mbYes, mbNo], 0) = mrYes then
      begin
        sysCtrl.IsLogon := False ;
        Close ;
      end;
    end;
      

  3.   

    dpr 主工程文件留修改下即可 ....
      Application.CreateForm(TFmLogin, FmLogin);
      if FmLogin.ShowModal() then  //此处重载了 Form.ShowModal
      begin
        FmLogin.Free;
        Application.CreateForm(TFmMain, FmMain);
        Application.Run;
      end
      else FmLogin.Free;
      ....
      

  4.   

    谢谢!测试过了,将登录容器放在主窗口,登录成功到FRM_MAIN主界面,但是问题又来,主界面下面的有几个MDICHILD显示的时候
    出错:cannot create form.no MDI ARE CURRENTLY ACTIVE.
    调用子窗体的代码是:
    procedure Tfrm_main.SpeedButton1Click(Sender: TObject);
    begin
      //Application.CreateForm(TFRM_GHS, FRM_GHS);
        frm_ghs:=tfrm_ghs.Create(application);
    end;
      

  5.   

    frm_ghs窗体在工程选项里是可用窗体,将它调整成自动创建窗体,还是报一样的错
      

  6.   

    看来问题,没有解决。Mid子窗体,可以采用动态窗体方式。