请教大虾们:
我写的用户登录窗体为模式窗体,
设定只有当用户登录模式窗体的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;
我写的用户登录窗体为模式窗体,
设定只有当用户登录模式窗体的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;
begin
ModalResult:=mrCancel;
Halt;
end;
这种方法也不行,我试过了:(To:guestman(天涯浪子)
是啊,在2K下还没发现存在这种问题,
但98下有的机子会,有的机子不会
而且也不是每次按SystemMenu的close都会,
但重复做几次可能就进去了
我在源程序中跟踪运行,都是从正常的代码Run到底,不会有事的
你用的是Halt
我用的是Terminate,
这两个有什么具体的区别吗?
麻烦你解释一下,3Q~~~
terminate要调用结束过程。