www.pudn.com > QQ_FACE.rar > login.pas


unit login; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ExtCtrls, Buttons, StdCtrls ,DB, TinyDB, RXCtrls, IniFiles; 
 
type 
  TFrmLogin = class(TForm) 
    EdtPwd: TEdit; 
    Image1: TImage; 
    Label1: TLabel; 
    Label2: TLabel; 
    ChbSavePwd: TCheckBox; 
    ChbHideme: TCheckBox; 
    CbxName: TComboBox; 
    LabDate: TLabel; 
    Bevel1: TBevel; 
    Bevel2: TBevel; 
    BtnOK: TBitBtn; 
    BtnClose: TBitBtn; 
    BtnRegiste: TBitBtn; 
    procedure FormCreate(Sender: TObject); 
    procedure BtnCloseClick(Sender: TObject); 
    procedure BtnRegisteClick(Sender: TObject); 
    procedure EdtPwdKeyDown(Sender: TObject; var Key: Word; 
      Shift: TShiftState); 
    procedure CbxNameChange(Sender: TObject); 
    procedure BtnOKClick(Sender: TObject); 
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 
 
var 
  FrmLogin: TFrmLogin; 
  bCanClose:boolean=False; 
 
implementation 
 
uses user_reg, Var_Share, main, dm_share, by_user; 
 
 
{$R *.dfm} 
 
 
//创建用户列表数据库 
function CreateDbUser:boolean; 
var 
   DbUser:TTinyDatabase; 
   sDbFileName:string; 
begin 
   Result:=True; 
 
   try 
      sDbFileName:=ExtractFilePath(Application.ExeName)+'users.dat'; 
      DbUser:=TTinyDatabase.Create(FrmMain_QQ); 
      DbUser.DatabaseName:=sDbFileName; 
      DbUser.Password:='icando'; 
      DbUser.CreateDatabase(sDbFileName,True,clNormal,'ZIP',True,'Blowfish','icando',True); 
 
      DbUser.CreateTable('UsersList',[ 
         FieldItem('QQNumber',ftString,20), 
         FieldItem('UserName',ftString,20), 
         FieldItem('Password',ftString,16), 
         FieldItem('FaceID',ftInteger,3), 
         FieldItem('IP',ftString,15), 
         FieldItem('IsSavePwd',ftBoolean), 
         FieldItem('IsHideSelf',ftboolean), 
         FieldItem('RegTime',ftDateTime), 
         FieldItem('Memo',ftMemo) 
         ]); 
      DbUser.CreateIndex('UsersList','ByQQNumber',[],['QQNumber']); 
      DbUser.CreateIndex('UsersList','ByUserName',[],['UserName']); 
   except 
      DeleteFile(sDbFileName); 
      Result:=False; 
   end; 
end; 
 
 
procedure TFrmLogin.FormCreate(Sender: TObject); 
var 
   sDbFileName,sLastUser:string; 
   i:integer; 
   MyIni:TIniFile; 
begin 
   //删除数据库--为测试版 
//   DeleteFile(ExtractFilePath(Application.ExeName)+'users.tdb'); 
 
 
   LabDate.Caption:=FormatDateTime('yyyy''年''mm''月''dd''日''dddd',Now); 
   g_sIP:=GetLocalIP; 
 
   sDbFileName:=ExtractFilePath(Application.ExeName)+'users.dat'; 
   if not FileExists(sDbFileName) then     //创建用户列表数据库 
   begin 
      if not CreateDbUser then 
      begin 
         MessageBox(Application.Handle,'错误','创建用户数据库时出错!',MB_OK+MB_ICONERROR); 
         Abort; 
      end; 
 
      DMShare.TblUsers.DatabaseName:=sDbFileName;//数据库创建好后给DMShare.TblUsers设置属性 
      DMshare.TblUsers.TableName:='UsersList'; 
      DMShare.TblUsers.Password:='icando'; 
//      BtnRegiste.SetFocus; 
   end 
   else   //读取数据库中用户列表 
   begin 
      DMShare.TblUsers.DatabaseName:=sDbFileName; 
      DMshare.TblUsers.TableName:='UsersList'; 
      DMShare.TblUsers.Password:='icando'; 
      DMShare.TblUsers.Open; 
      DMShare.TblUsers.First; 
      if DMShare.TblUsers.RecordCount<>0 then BtnOK.Enabled:=True;//使登陆按钮生效 
      for i := 0 to DMShare.TblUsers.RecordCount-1 do 
      begin 
         CbxName.Items.Add(DMShare.TblUsers.FieldValues['UserName']); 
         DMShare.TblUsers.Next; 
      end; 
      //读取INI文件中上次登陆用户名 
      MyIni := TIniFile.Create(ExtractFilePath(Application.ExeName)+'setup.ini'); 
      try 
         sLastUser:=MyIni.ReadString('Info','LastUser',''); 
      finally 
         MyINI.Free; 
      end; 
 
      if sLastUser<>'' then 
      begin 
         CbxName.ItemIndex:=CbxName.Items.IndexOf(sLastUser); 
      end 
      else 
      begin 
         CbxName.ItemIndex:=0; 
      end; 
 
//      EdtPwd.SetFocus; 
   end; 
 
   if DMShare.TblUsers.RecordCount<>0 then 
   begin 
      DMShare.TblUsers.First; 
      sUserName:=CbxName.Text; 
      DMShare.TblUsers.Locate('UserName',sUserName,[loCaseInsensitive]); 
      sQQNumber:=DMShare.TblUsers.FieldValues['QQNumber']; 
      sPassword:=DMShare.TblUsers.FieldValues['Password']; 
      iFaceID:=DMShare.TblUsers.FieldValues['FaceID']; 
      BtnOK.Enabled:=True; 
   end 
   else 
   begin 
      BtnOK.Enabled:=False; 
   end; 
//是否自动登陆 
{   if DMShare.TblUsers.FieldValues['IsSavePwd'] then 
   begin 
      EdtPwd.Text:=sPassword; 
      BtnOK.Click; 
   end; 
} 
end; 
 
procedure TFrmLogin.BtnCloseClick(Sender: TObject); 
begin 
   self.Hide; 
   self.Close; 
   if not bLogined then 
   begin 
     Application.ShowMainForm:=False; 
     Application.Terminate; 
     DMShare.TblUsers.Close; 
   end; 
end; 
 
procedure TFrmLogin.BtnRegisteClick(Sender: TObject); 
begin 
   bIsReg:=False; 
   with TFrmReg.Create(Application) do 
   begin 
      try 
         ShowModal; 
         Update; 
      finally 
         Release; 
      end; 
   end; 
 
   if bIsReg then 
   begin 
      CbxName.Items.Add(sUserName); 
      CbxName.ItemIndex:=CbxName.Items.IndexOf(sUserName); 
      EdtPwd.Text:=sPassword; 
      BtnOK.Enabled:=True; 
      BtnOK.SetFocus; 
   end; 
end; 
 
procedure TFrmLogin.EdtPwdKeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState); 
begin 
   if (BtnOK.Enabled) and (Key=Vk_Return) then 
   begin 
      BtnOK.Click; 
   end; 
 
end; 
 
procedure TFrmLogin.CbxNameChange(Sender: TObject); 
begin 
   EdtPwd.Clear; 
   EdtPwd.SetFocus; 
   sUserName:=CbxName.Text; 
   DMShare.TblUsers.First; 
   DMShare.TblUsers.Locate('UserName',sUserName,[loCaseInsensitive]); 
   sQQNumber:=DMShare.TblUsers.FieldValues['QQNumber']; 
   sPassword:=DMShare.TblUsers.FieldValues['Password']; 
   iFaceID:=DMShare.TblUsers.FieldValues['FaceID']; 
   //“保存密码”选项 
   ChbSavePwd.Checked:=DMShare.TblUsers.FieldValues['IsSavePwd']; 
end; 
 
procedure TFrmLogin.BtnOKClick(Sender: TObject); 
var 
   sDbFileName:string; 
   MyIni:TIniFile; 
begin 
   if EdtPwd.Text<>sPassword then 
   begin 
      MessageBox(GetActiveWindow(),'密码错误!请核对后再行输入。','错误',MB_OK+MB_ICONERROR); 
      EdtPwd.Clear; 
      EdtPwd.SetFocus; 
      Abort; 
   end; 
 
   if not (DirectoryExists(ExtractFilePath(Application.ExeName)+sQQNumber)) 
      or not (FileExists(ExtractFilePath(Application.ExeName)+sQQNumber+'\friends.dat')) then 
   begin 
      while DMShare.TblUsers.RecordCount<>0 do 
      begin 
         MessageBox(GetActiveWindow(),'用户数据库遭到破坏,重新注册可解决此问题!','错误',MB_OK+MB_ICONERROR); 
         DMShare.TblUsers.Locate('QQNumber',sQQNumber,[]); 
         DMShare.TblUsers.Delete; 
         CbxName.Items.Delete(CbxName.ItemIndex); 
         CbxName.ItemIndex:=0; 
         EdtPwd.Clear; 
         Abort; 
      end; 
   end; 
//设定好友相关数据库的属性 
   sDbFileName:=ExtractFilePath(Application.ExeName)+sQQNumber+'\friends.dat'; 
   with DMShare.TblFriends do 
   begin 
      if not Active then 
      begin 
         DatabaseName:=sDbFileName; 
         TableName:='Friends'; 
         Password:='icando'; 
         Open; 
      end; 
   end; 
 
   with DMShare.TblChatLog do 
   begin 
      if not Active then 
      begin 
         DatabaseName:=sDbFileName; 
         TableName:='ChatLog'; 
         Password:='icando'; 
         Open; 
      end; 
   end; 
 
   with DMShare.TblSystemMsg do 
   begin 
      if not Active then 
      begin 
         DatabaseName:=sDbFileName; 
         TableName:='SystemMsg'; 
         Password:='icando'; 
         Open; 
      end; 
   end; 
//设定全局变量的值 
   sUserName:=CbxName.Text; 
   DMShare.TblUsers.First; 
   DMShare.TblUsers.Locate('UserName',sUserName,[loCaseInsensitive]); 
   sQQNumber:=DMShare.TblUsers.FieldValues['QQNumber']; 
   sPassword:=DMShare.TblUsers.FieldValues['Password']; 
   iFaceID:=DMShare.TblUsers.FieldValues['FaceID']; 
   g_sIP:=GetLocalIP; 
   bLogined:=True; 
  //判断“保存密码”选项 
   DMShare.TblUsers.Edit; 
   DMShare.TblUsers.FieldValues['IsSavePwd']:=ChbSavePwd.Checked; 
   DMShare.TblUsers.Post; 
 
//关闭用户列表数据库 
   DMShare.TblUsers.Close; 
 
//将上次登陆用户名写进 INI 文件 
   MyINI:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'setup.ini'); 
   try 
      MyINI.WriteString('Info','LastUser',sUserName); 
   finally 
      MyIni.Free; 
   end; 
 
 
   bCanClose:=True;//使此窗体能够被Close 
   Close; 
end; 
 
procedure TFrmLogin.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
   CanClose:=bCanClose; 
end; 
 
end.