请教大虾们:
    我写的用户登录窗体为模式窗体,
设定只有当用户登录模式窗体的ModalResult返回为mrOK时才能进入到主窗体,
否则程序执行Terminate,但现在的问题是直接按SystemMenu的X(关闭)时,
就可以直接进入到主窗体了(主窗体是MDIForm),也不用去检验用户和密码,
(登录窗体上用来显示用户名称是用combobox来列出表中的用户名称,
然后用Edit来输入用户密码)
但关键的是并不是每一台机子都会发生这事,也不是每台机子每次都会成功进入,
有时需多试按几下关闭也可以进入(一般都发生在98系统下,2K以上的还没发现)该用户登录窗体的相关Properties如下,
BorderIcons的biSystemMenu为True其他为False
(后来我把它改为False来解决的,但为什么会这样,这是我想问的问题所在),
BorderStyle====>bsDialog,
FormStyle======>fsNormal,
KeyPreview=====>True以下是登录窗体上的两个按钮[确定]和[取消]的code
procedure Tfrmlogin.BitBtn1Click(Sender: TObject);//[确定]
var shifou:boolean;
begin
  if i>=3 then
  begin
    if i>=3 then showmessage('抱歉您是非法用户!');
    bitbtn2.click;
    exit;
  end;
  if combo1.Text='' then
  begin
     showmessage('请选用户');
     combo1.setfocus;
     exit;
  end;
  if edit1.Text='' then
  begin
     showmessage('请输密码');
     edit1.setfocus;
     exit;
  end;
  with Table1 do//table1指定为用户表
  begin
    shifou:=
    Locate('useid;ma', VarArrayOf([trim(combo1.text),trim(edit1.text)]), [loCaseInsensitive]);
  end;
  if shifou then
  begin
    frmmain.status1.Panels[0].Text:=combo1.text;
    //限制使用天数表
    yh:=table1.fieldbyname('useid').asstring;
    modalresult:=mrok;
  end else begin
    i:=i+1;
    showmessage('密码错!请重输');
    edit1.text:='';
    edit1.setfocus;
  end;
end;procedure Tfrmlogin.BitBtn2Click(Sender: TObject);//[取消]
begin
  modalresult:=mrCancel;
end;然后根据FrmLogin的ShowModal的结果执行下面code,这些code是写在FrmMain(主窗体)的OnCreate事件中
  Frmlogin:=TFrmlogin.create(Application);
  try
      if Frmlogin.ShowModal=mrok then
      begin
         with qry_user do
         begin
           close;
           sql.Clear;
           sql.add('select * from tb_user');//用户表
           sql.Add('where useid='''+trim(frmmain.status1.Panels[0].Text)+'''');
           try
             open;
           except
             execsql;
           end;
           if frmmain.status1.Panels[0].Text<>'系统管理员' then  menustates;
           close;
         end;
      end else begin
         Application.Terminate;
      end;
  except
      Application.Terminate;
  end;

解决方案 »

  1.   

    onClose
    begin
      ModalResult:=mrCancel;
      Halt;
    end;
      

  2.   

    To:swayi21(微斯人)
    这种方法也不行,我试过了:(To:guestman(天涯浪子)
    是啊,在2K下还没发现存在这种问题,
    但98下有的机子会,有的机子不会
    而且也不是每次按SystemMenu的close都会,
    但重复做几次可能就进去了
    我在源程序中跟踪运行,都是从正常的代码Run到底,不会有事的
      

  3.   

    To:swayi21(微斯人)
    你用的是Halt
    我用的是Terminate,
    这两个有什么具体的区别吗?
    麻烦你解释一下,3Q~~~
      

  4.   

    halt是无条件结束
    terminate要调用结束过程。