經常看到一些新手在CSDN上問登錄窗口如何寫,也看到N多人form1.show/form1.create/…中做form2.show之類。實在看不下去了。這種寫法實在不是很好,於是還是把自己理解的登錄框架來寫寫吧。希望能給新人一些引導(可不要誤導了呀!)
1.登錄窗口在什么地方調用?
我說:最好在項目文件中,splash窗口顯示過,一些需要加載的資源、窗口加載過后,Application.Run之前,進行用戶登錄。此時,可能用到的數據連接已經建立起來了,登錄就可以進系統。
2.如何調用登錄窗口?
我說:在登錄窗口單元提供一個函數出來吧,比如Login():Boolean; 這樣在要到的地方直接調用LoginF.Login()就可以呼叫登錄窗口,並使用標准邏輯了。畢竟,你的登錄窗口在系統中至少有兩個地方要用到(啟動時、重新登錄時).
//項目文件代碼
program KBS;
uses
Forms,
Windows,
MainF in 'MainF.pas' {frmMain},
SplashF in 'SplashF.pas' {frmSplash},
mainDM in 'mainDM.pas' {dmMain: TDataModule},
LoginF in 'LoginF.pas' {frmLogin};
{$R *.RES}
var
frmMain: TfrmMain;
dmMain: TdmMain;
begin
Application.Initialize;
//顯示封面
SplashF.Show;
try
//創建需要的資源
Application.CreateForm(TdmMain, dmMain);
Application.CreateForm(TfrmMain, frmMain);
//...其它
finally
SplashF.Close;
end;
if LoginF.Login() then //呼叫登錄窗口:就這一行,簡單吧!
Application.Run;
end.
3.登錄窗口如何寫?
我說:這個比較簡單,直接上代碼吧。有不懂的再交流。
unit LoginF;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons;
type
TfrmLogin = class(TForm)
pnl1: TPanel;
edUserName: TEdit;
lblUserName: TLabel;
edPasswd: TEdit;
lblPasswd: TLabel;
btnOK: TBitBtn;
btnCancel: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure btnOKClick(Sender: TObject);
private
FTryTimes: Integer;
function CheckUserInfo(AUserName, APassword: string): Boolean;
public
end;
function Login: Boolean; //登錄函數
implementation
{$R *.DFM}
function Login: Boolean;
begin
//動態創建登錄窗口
with TfrmLogin.Create(nil) do
begin
//只有返回OK的時候認為登錄成功
Result := ShowModal() = mrOk;
Free;
end;
end;
function TfrmLogin.CheckUserInfo(AUserName, APassword: string): Boolean;
begin
//簡單的驗證,可以修改為其它的方式
Result := (AUserName = 'lihd' ) and (APassword = 'P@ssw0rd');
end;
procedure TfrmLogin.FormCreate(Sender: TObject);
begin
//嘗試登錄的次數,初始化為0
FTryTimes := 0;
end;
procedure TfrmLogin.btnOKClick(Sender: TObject);
begin
Inc(FTryTimes); //嘗試登錄的次數 + 1
if CheckUserInfo(edUserName.Text, edPasswd.Text) then
begin
//如果通過檢查,返回OK
Self.ModalResult := mrOk;
end else
begin
if (FTryTimes > 2) then
begin
MessageBox(self.Handle, '你已經嘗試登錄3次,請聯系系統管理員。', '錯誤', MB_OK + MB_ICONERROR);
Self.ModalResult := mrCancel;
Exit;
end;
//通不過,報錯
MessageBox(self.Handle, '錯誤的用戶名或密碼,請重新輸入!', '錯誤', MB_OK + MB_ICONERROR);
edUserName.SetFocus();
edUserName.SelectAll();
end;
end;
end.
最后,啰嗦一句:一定要好好命名函數和控件!不要一大篇form1/form2/…edit1/edit2/…要多寫注釋!代碼縮進要有章法!