关于登录模块的问题
我在做管理系统,主要功能是首先显示欢迎页面,然后延时3s显示登录页面,输入正确的用户名密码后进入主界面;若用户名、密码错误输入3次自动退出程序。
1.我现在的程序是主界面和登录对话框同时显示,但我想在欢迎页面后只显示登录对话框,不显示主界面要怎么实现呢?
2.我现在只输错一次用户名、密码就自动退出登录对话框了,请问是哪里错?
我的工程文件如下:
program PersonMIS;
uses
Forms,
UnitStartup in 'UnitStartup.pas ' {StartupForm},
UnitLogin in 'UnitLogin.pas ' {LoginForm},
UnitMain in 'UnitMain.pas ' {MainForm},
UnitDM in 'UnitDM.pas ' {DM: TDataModule};
{$R *.res}
begin
Application.Initialize;
StartupForm:= TStartupForm.Create(StartupForm);
StartupForm.Show;
StartupForm.Update;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TLoginForm, LoginForm);
Application.CreateForm(TDM, DM);
StartupForm.Hide;
StartupForm.Free;
Application.Run;
end.
登录界面:
unit UnitLogin;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, Buttons,ADODB;
type
TLoginForm = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
LoginForm: TLoginForm;
implementation
uses UnitDM,UnitMain;
var
i:integer=3;
id,pd:string;
sys:Boolean = false;
{$R *.dfm}
procedure TLoginForm.FormCreate(Sender: TObject);
var
currentTime:real;
//使FormLogin延时3秒打开
begin
currentTime:=GetTickCount div 1000;
while ((GetTickCount div 1000) <(currentTime+3)) do
{什么都不做};
end;
procedure TLoginForm.BitBtn2Click(Sender: TObject);
begin
mainform.close;
end;
procedure TLoginForm.BitBtn1Click(Sender: TObject);
var
aqlogin:TADOQuery;
begin
if edit1.Text <> ' ' then
begin
Dec(i);
aqlogin:=TADOQuery.Create(nil);
aqlogin.Connection:=DM.ADOConnection1;
aqlogin.SQL.Text:= 'select * from login where username= ' + QuotedStr(Trim(edit1.Text)) + ' ';
aqlogin.Open;
if not aqlogin.Eof then
begin
if aqlogin.FieldByName( 'password ').AsString=edit2.Text then
begin
id:=trim(edit1.Text);
pd:=edit2.Text;
if aqlogin.FieldByName( 'sysadmin ').AsBoolean then
sys:=true
else
sys:=false;
self.ModalResult:=mrok;
end
else
begin
Application.MessageBox( '您输入的密码错误,请重新输入! ', '提示信息 ',mb_ok);
edit2.Clear;
edit2.SetFocus;
end;
end
else
begin
if i=0 then mainform.close;//输入三次后自动关闭
Application.MessageBox( '您输入的用户名错误,请重新输入! ', '提示信息 ',mb_ok);
edit1.Clear;
edit1.SetFocus;
end;
end
else
begin
Application.MessageBox( '用户名不能为空,请输入! ', '提示信息 ',mb_ok);
edit1.SetFocus;
end;
end;
end.
主界面:
procedure TMainForm.FormActivate(Sender: TObject);
begin
loginform.ShowModal;
end;
[解决办法]
放到一个form里面用定时器切换,或者放到project里面,自己写代码showmod。。
[解决办法]
1、登陆界面有可以用以下方法出来
A方法就是如楼上所说放到PROJECT的DPR文件里, 在APPLICATION.CREATEFORM之前
loginForm := TLoginForm.Create(Application);
loginForm.ShowModal;
B还有就是放在TMainForm.OnShow事件,最好不要放在OnActivate事件里
2、没有测试你的代码, 关于你说的只输入一次就 关闭,应该是你在LOGINFORM里把BitBtn1的ModalResult付了值吧
[解决办法]
放在project里面写吧。这样方便一点。
[解决办法]
楼主这样的登录方式是比较常用的,最好写到Project单元里,如:
program Project1;
uses
Forms,
SysUtils,
Mainfrm in 'Mainfrm.pas ' {Form1},
SplashFrm in 'SplashFrm.pas ' {frmSplash},
LoginFrm in 'LoginFrm.pas ' {frmLogin};
{$R *.res}
begin
Application.Initialize;
frmSplash := TfrmSplash.Create(nil);
frmSplash.ShowModal;
FreeAndNil(frmSplash);
frmLogin := TfrmLogin.Create(nil);
frmLogin.ShowModal;
if frmLogin.Login then
begin
FreeAndNil(frmLogin);
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end
else
begin
FreeAndNil(frmLogin);
Application.Run;
Application.Terminate;
end;
end.
说明:
1、frmSplash: 欢迎界面(普通窗口),添加一个定时器,3秒后关闭frmSplash,即frmSplash.Close
当然也可以延时。
2、frmLogin: 登录界面(普通窗口),定义一个私有变量,LoginDec,初始为3,每执行一次登录
操作减1。定义一个Login属性,初始为false,登录成功时为true。
登录成功或者LoginDec变为0时,关闭frmLogin。
3、frmMain: 主界面(普通窗口或MDI窗口),登录成功先创建。
[解决办法]
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas ' {Frm_Main},
Unit2 in 'Unit2.pas ' {Frm_Splash},
Unit3 in 'Unit3.pas ' {Frm_Login};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TFrm_Main, Frm_Main);
Application.CreateForm(TFrm_Splash, Frm_Splash);
Application.Run;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TFrm_Main = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Frm_Main: TFrm_Main;
implementation
uses Unit2, Unit3;
{$R *.dfm}
procedure TFrm_Main.FormCreate(Sender: TObject);
begin
Frm_Splash := TFrm_Splash.Create(Self);
Frm_Main.Hide;
if Frm_Splash.ShowModal = mrok then
begin
FreeAndNil(Frm_Splash);
Frm_Login := TFrm_Login.Create(Self);
if Frm_Login.ShowModal = mrok then
FreeAndNil(Frm_Login)
else
Application.Terminate;
end
else
Application.Terminate
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls;
type
TFrm_Splash = class(TForm)
Image1: TImage;
Timer1: TTimer;
procedure Image1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Frm_Splash: TFrm_Splash;
implementation
{$R *.dfm}
procedure TFrm_Splash.Image1Click(Sender: TObject);
begin
ModalResult := mrOk;
end;
procedure TFrm_Splash.Timer1Timer(Sender: TObject);
begin
ModalResult := mrOk;
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons;
type
TFrm_Login = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Edit1: TEdit;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Frm_Login: TFrm_Login;
implementation
var
i: Integer = 0;
{$R *.dfm}
procedure TFrm_Login.BitBtn1Click(Sender: TObject);
begin
{登陆验证,根据情况自己修改}
if Edit1.Text = 'ABC ' then
ModalResult := mrOk
else
Inc(i);
if i > =3 then
begin
Application.MessageBox( '密码错误已错误3次,程序将关闭! ', '错误 ', MB_OK +
MB_ICONSTOP + MB_TOPMOST);
ModalResult := mrCancel;
end;
end;
end.
[解决办法]
以上代码能达到楼主的要求,如果有什么问题可加群8581139
[解决办法]
在主界面的onshow方法里调出登陆界面ShowModal.在project-> optoins里设置登陆界面不为自动创建.
登录一次就关闭登录框,楼主可以调试一下代码,看看在那出错.
[解决办法]
使用ShowModal在工程文件中写