首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于登录模块的有关问题

2012-04-09 
关于登录模块的问题我在做管理系统,主要功能是首先显示欢迎页面,然后延时3s显示登录页面,输入正确的用户名

关于登录模块的问题
我在做管理系统,主要功能是首先显示欢迎页面,然后延时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在工程文件中写

热点排行