需要实现:
先出现登窗体,登录正确后主窗体才可用。其他的窗体等登录完以后需要时才创建。
问题:
现在的问题是在登录窗体时输入错误的密码以后,登录窗体就消失了,主窗体就可用了,请问怎么控制???登录窗体文件========================================
unit FormLogin;
.........
private
{ Private declarations }
public
{ Public declarations }
end;var
Form_login: TForm_login;
Li_Login:integer;
implementation
Uses FormMain;
{$R *.dfm}procedure TForm_login.BitBtn1Click(Sender: TObject);
var
Js:string;
begin
if not query1.Locate('用户名;密码',vararrayof([combobox_name.Text,password.Text]),[]) then
begin
showmessage('对不起,密码不正确,请重新输入!');
Li_Login:=Li_Login+1;
Password.SetFocus;
Password.SelectAll;
if Li_Login>=3 then
Begin
showmessage('尝试三次不能成功,系统自动退出!');
close;
application.Terminate;
end;
end
else
begin
case query1.FieldByName('类型').AsInteger of
0:js:='系统管理员';
1:js:='一般用户';
2:js:='操作员';
end;
Form_main.StatusBar1.Panels[0].Text:='当前用户: '+query1.fieldbyname('用户名').AsString;
Form_main.StatusBar1.Panels[1].Text:='用户角色: '+js;
close;
end
end;procedure TForm_login.FormCreate(Sender: TObject);
begin
with query1 do begin
close;
sql.Clear;
sql.Add('select * from 用户库');
open;
Try
while not Eof do
begin
combobox_name.Items.Add(fieldbyname('用户名').AsString);
next;
end;
combobox_name.ItemIndex:=0;
finally;
end;
end;
Li_Login:=0;
end;procedure TForm_login.BitBtn2Click(Sender: TObject);
begin
query1.Close;
application.Terminate;
end;
procedure TForm_login.FormClose(sender:TObject; var action:TcloseAction);
begin
action:=cafree;
end;
procedure TForm_login.FormShow(sender:Tobject);
begin
password.SetFocus;
End;end.
主窗体创建事件 ===================================
procedure TForm_main.FormCreate(Sender: TObject);
begin
show();
if not assigned(Form_login) then
begin
Form_login:=tForm_login.Create(Application); end;
Form_login.showmodal;
Form_login.Free;
Form_login:=nilend;工程文件==============================================program IEBookMIS;......{$R *.res}begin
Application.Initialize;
Application.CreateForm(TForm_main, Form_main);
Application.CreateForm(TForm_login, Form_login);
Application.Run;
end.
先出现登窗体,登录正确后主窗体才可用。其他的窗体等登录完以后需要时才创建。
问题:
现在的问题是在登录窗体时输入错误的密码以后,登录窗体就消失了,主窗体就可用了,请问怎么控制???登录窗体文件========================================
unit FormLogin;
.........
private
{ Private declarations }
public
{ Public declarations }
end;var
Form_login: TForm_login;
Li_Login:integer;
implementation
Uses FormMain;
{$R *.dfm}procedure TForm_login.BitBtn1Click(Sender: TObject);
var
Js:string;
begin
if not query1.Locate('用户名;密码',vararrayof([combobox_name.Text,password.Text]),[]) then
begin
showmessage('对不起,密码不正确,请重新输入!');
Li_Login:=Li_Login+1;
Password.SetFocus;
Password.SelectAll;
if Li_Login>=3 then
Begin
showmessage('尝试三次不能成功,系统自动退出!');
close;
application.Terminate;
end;
end
else
begin
case query1.FieldByName('类型').AsInteger of
0:js:='系统管理员';
1:js:='一般用户';
2:js:='操作员';
end;
Form_main.StatusBar1.Panels[0].Text:='当前用户: '+query1.fieldbyname('用户名').AsString;
Form_main.StatusBar1.Panels[1].Text:='用户角色: '+js;
close;
end
end;procedure TForm_login.FormCreate(Sender: TObject);
begin
with query1 do begin
close;
sql.Clear;
sql.Add('select * from 用户库');
open;
Try
while not Eof do
begin
combobox_name.Items.Add(fieldbyname('用户名').AsString);
next;
end;
combobox_name.ItemIndex:=0;
finally;
end;
end;
Li_Login:=0;
end;procedure TForm_login.BitBtn2Click(Sender: TObject);
begin
query1.Close;
application.Terminate;
end;
procedure TForm_login.FormClose(sender:TObject; var action:TcloseAction);
begin
action:=cafree;
end;
procedure TForm_login.FormShow(sender:Tobject);
begin
password.SetFocus;
End;end.
主窗体创建事件 ===================================
procedure TForm_main.FormCreate(Sender: TObject);
begin
show();
if not assigned(Form_login) then
begin
Form_login:=tForm_login.Create(Application); end;
Form_login.showmodal;
Form_login.Free;
Form_login:=nilend;工程文件==============================================program IEBookMIS;......{$R *.res}begin
Application.Initialize;
Application.CreateForm(TForm_main, Form_main);
Application.CreateForm(TForm_login, Form_login);
Application.Run;
end.
end
else
begin
case query1.FieldByName('类型').AsInteger of
0:js:='系统管理员';
1:js:='一般用户';
2:js:='操作员';
end;
Form_main.StatusBar1.Panels[0].Text:='当前用户: '+query1.fieldbyname('用户名').AsString;
Form_main.StatusBar1.Panels[1].Text:='用户角色: '+js;
close;
end
那里有判断用户的密码
begin
if active then close;
sql.clear;
sql.text:='select UserID,username from login where (Userid='''+trim(edtuserid.text)+''')and(username='''+trim(username.text)+''')';
open;
if isempty then
begin
inc(iTimes);
if iTimes=3 then
begin
MyError('您进行系统身份确认程序错误已经超过3次,本系统即将停止执行!');
Application.Terminate;
end;
username.setfouce;
end
else
begin
进入主窗体!
end;
end;
仅供参考!
begin
if not query1.Locate('用户名;密码',vararrayof([combobox_name.Text,password.Text]),[]) then
begin
showmessage('对不起,密码不正确,请重新输入!');
Li_Login:=Li_Login+1;
在project1中使用
如果密码错误就halt;
注意:如果用到datamodule的话先datamodule.free再halt;
procedure TForm_main.FormCreate(Sender: TObject);
begin
show();
if not assigned(Form_login) then
Form_login:=tForm_login.Create(Application); try
if Form_login.showmodal<> mrOk then application.Terminate;// Form_login.showmodal;
finally
Form_login.Free;
Form_login:=nil
end;
end;
begin
action:=cafree;
end;
当你密码不对时是不能阻止主窗体的创建的,因为你的登入窗口是在主窗口建立之后才出现的,所以当你关闭登入窗口时,就相当于是在mdi主窗口中关闭了一个有主窗口建立的字窗口,他自然会进入主窗体,所以你必须把登入窗体设置成普通的form模式,然后在工程文件中创建他,但是创建顺序是县创建mdi主窗体,然后在创建登入窗体,但是mdi先不要显示,在等入窗体中用户正确之后再把登入窗口关闭,mdi主窗口显示,就可以,这个问题我也弄了老长时间,你可以从网上艘以下,会找到解决办法的。。
Application.Initialize;
Application.CreateForm(TForm1, Form1);//mdi主窗口
Application.CreateForm(TDataModule8, DataModule8);
Application.ShowMainForm:=false;
form10 := Tform10.create(application);//登入窗口
form10.Show;
form10.edit1.SetFocus;
application.Run;
end.在form10的判断用户正确中:
Application.ShowMainForm:=true;
form1.ShowModal;
这样就可以了。。
将 登陆窗体.FREE 就可以了
问题1,你的project文件中,是先创建了主窗体main。但是main的create事件里又创建了登录窗体login,接着又在project里用application创建了登录form, 重复创建
问题2:代码本身没问题,关键是,你的登录窗口不是主窗口,你退出登录窗口之后,主窗口必然会运行,唯一的办法,就是在登录验证代码里加入一个标志,例如用登录窗口的tag值来做标志,0表示未能通过登录验证,1表示通过,这样你可以在登录窗口的close事件里写
if tag=0 then application.terminate;修改意见,建议你把主窗体CReate事件里的代码删除,
然后修改project项目文件
program IEBookMIS;......{$R *.res}begin
Application.Initialize;
Application.CreateForm(TForm_main, Form_main);
Application.CreateForm(TForm_login, Form_login);
Form_login.showmodal;
Application.Run;
end.验证代码
procedure TForm_login.BitBtn1Click(Sender: TObject);
var
Js:string;
begin
if not query1.Locate('用户名;密码',vararrayof([combobox_name.Text,password.Text]),[]) then
begin
showmessage('对不起,密码不正确,请重新输入!');
//这个表示登录未通过 失败了
tag:=0;
Li_Login:=Li_Login+1;
Password.SetFocus;
Password.SelectAll;
if Li_Login>=3 then
Begin
showmessage('尝试三次不能成功,系统自动退出!');
close;
application.Terminate;
end;
end
else
begin
case query1.FieldByName('类型').AsInteger of
0:js:='系统管理员';
1:js:='一般用户';
2:js:='操作员';
end;
//这个表示登录未通过 失败了
tag:=1;
Form_main.StatusBar1.Panels[0].Text:='当前用户: '+query1.fieldbyname('用户名').AsString;
Form_main.StatusBar1.Panels[1].Text:='用户角色: '+js;
close;
end
end;登录窗口的Close事件里:
if tag=0 then Application.terminate
else self.free;
Application.Initialize;
try
FrmLog:=TFrmLog.Create(Application);
FrmLog.ShowModal ;
if FrmLog.ModalResult =mrok then(登陆成功)
begin
Application.CreateForm(TFrmMain, FrmMain);
FrmMain.LoadForm ;
Application.Run;
end
else begin
Application.Terminate ;
end;
finally
FrmLog.Free;
FrmLog:= nil;
end;