合理应用用户登录界面,用户登录时不必创建其他窗体
2006-02-04 13:51:20 来源:WEB开发网///////////////////// (一)项目文件 test.dPR //////////////////////
program SerialGet;
uses
Forms,
UMain in 'UMain.pas' {frmMain},
ULogin in 'ULogin.pas' {frmLogin},
UDataModule in 'UDataModule.pas' {DataModule1: TDataModule},
{$R *.res}
begin
application.Initialize;
if CreateMutex then //创建句柄,判断此应用程序是否在运行
begin
//调用全局函数,创建并显示登陆界面
if doLogin then //登陆成功
begin
Application.CreateForm(TfrmMain, frmMain);
//数据模块文件不须在这儿创建,因为 ULogin.pas 中已创建
//Application.CreateForm(TDataModule1, DataModule1);
Application.Run;
end else //登陆不成功
begin
try
DataModule1.free;
Application.terminate;
except
end;
end;
end else
begin
DestroyMutex; //释放句柄
end;
end.
//////////////// (二)登陆窗体 ULogin.pas ULogin.dfm //////////////////
unit ULogin;
interface
uses ......
type
... ... ...
private
function checkPsw:integer;
public
end;
var
frmLogin: TfrmLogin;
function doLogIn:boolean; // 全项目公用函数
function CreateMutex: Boolean; // 全项目公用函数
procedure DestroyMutex; // 全项目公用函数
implementation
uses UDataModule; //引用数据模块
var Mutex: hWnd;
{$R *.dfm}
function doLogIn:boolean; //由项目文件调用此函数
begin
with TfrmLogin.create(application) do //创建并显示登陆界面
begin
//窗体的ShowModal属性
if ShowModal = mrok then result := true else result := false;
free;
end;
end;
procedure DestroyMutex;
begin
if Mutex <> 0 then CloseHandle(Mutex);
end;
function CreateMutex: Boolean;
var
PrevInstHandle: THandle;
AppTitle: PChar;
begin
AppTitle := StrAlloc(100);
StrPCopy(AppTitle, Application.Title);
Result := True;
Mutex := Windows.CreateMutex(nil, False, AppTitle);
if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then begin
Result := False;
SetWindowText(Application.Handle, '');
PrevInstHandle := FindWindow(nil, AppTitle);
if PrevInstHandle <> 0 then begin
if IsIconic(PrevInstHandle) then
ShowWindow(PrevInstHandle, SW_RESTORE)
else
BringWindowToTop(PrevInstHandle);
SetForegroundWindow(PrevInstHandle);
end;
if Mutex <> 0 then Mutex := 0;
end;
StrDispose(AppTitle);
end;
// -1: 密码不对 1:数据库不对 2:没有此用户 3:合法
function TfrmLogin.checkPsw:integer;
var name,sPsw,SQL,sValue:string;
begin
Application.CreateForm(TDataModule1, DataModule1); //此处创建了数据模块
if not DataModule1.ConnOK then
begin result := 1; exit; end;
name := lowercase(editName.text); //文本框
sPsw := lowercase(editPass.text); //文本框
sql := 'select * from maker where name="'+name+'"';
if openSQL(SQL,DataModule1.dsDataSet) <=0 then
begin result := 2; exit; end;
DataModule1.dsDataSet.First ;
sValue := lowercase(DataModule1.dsDataSet.fieldbyName('loginPsw').asString);
if sValue<>sPsw then result := -1 else result := 3;
end;
///////////////////// (三)数据模块 UDataModule.pas //////////////////////
... ... ... ...
type
public
ConnOK:boolean;
end;
var
DataModule1: TDataModule1;
function OpenSQL(s: string;query:TADODataSet):integer;
function DoSQL(s: string;query:TADOQuery):boolean;
implementation
{$R *.dfm}
procedure TDataModule1.DataModuleCreate(Sender: TObject); //连接ADOConnection
var SQL,pwd:string;
begin
try
pwd := 'deliSerial';
SQL := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+
extractfilepath(paramstr(0))+'SerialInfo.mdb'+
';Persist Security Info=False;' +
'Jet OLEDB:Database PassWord="'+pwd+'"';
ADOConnection1.Connected := false;
ADOConnection1.ConnectionString := SQL;
ADOConnection1.Connected := true;
ConnOK:=true;
except
ConnOK:=false;
end;
end;
function OpenSQL(s: string;query:TADODataSet):integer; //查询SQL
var old_Cursor:TCursor;
begin
old_Cursor:=screen.cursor;
screen.cursor:=crSQLWait;
try
try
with query do
begin
close; commandtext:=s; open;
result:=query.recordcount; //返回结果集记录数
end;
except
result:=0;
end;
finally
screen.cursor:=old_Cursor;
end;
end;
function DoSQL(s: string;query:TADOQuery):boolean; //运行 SQL
var old_Cursor:TCursor;
begin
result:=true;
old_Cursor:=screen.cursor;
screen.cursor:=crSQLWait;
try
try
with query do
begin
close; SQL.Clear; SQL.Add(s); ExecSQL;
end;
except
result:=false;
end;
finally
screen.cursor:=old_Cursor;
end;
end;
赞助商链接