foxmail是用的自定义的文件格式保存这些信息的,这样可以很底层的操作数据文件,加密方面可以自己选.大概是每个用户一个文件夹,里面有好多的数据文件,你可以打开看看.如果是DB库安全问题好像不过关,也达不到操作的灵活性,不过自定义的数据格式比较复杂要考虑的东西比较多,你看看自己选取一下吧。

解决方案 »

  1.   

    unit UserInfo;interfaceuses
     Windows,SysUtils,Classes,Dialogs;
    type
     TPurview = (tpRead,tpReadWrite); TAccessLog = record             
       Count : LongInt;
       Time  : array[0..100]of TDateTime;
     end;
     
     TFileHead = record
       Counter : LongInt;          
     end; TFileData = record
       Index     : LongInt;
       UserName  : array[0..100] of Char;
       UserPwd   : array[0..100] of Char;
       UserPuw   : TPurview;            
       AccessLog : TAccessLog;          
     end;
    TUserInfo = class
     private
       FFileName   : String;
       FFileHandle : Integer;           
       FFileHead   : TFileHead;         
       FFileData   : TFileData;         
       FLogined    : Boolean;           
       FPwdChanged : Boolean;             
       procedure CreateLDLFile;         
       function  GetUserIndex(Name : String): LongInt; 
       procedure SaveLoginTime;
       procedure SetPwdChanged(Value : Boolean);
     public
       constructor Create(Fn:String;Mode:Word;Name,Pwd:String);
       destructor Destroy;override;
       procedure Free;
       procedure LoadLDLFile(Pos:LongInt);
       procedure SaveLDLFile(New:Boolean;Pos:LongInt); 
       property FileName   : String read FFileName;
       property FileData   : TFileData read FFileData   write FFileData;
       property FileHead   : TFileHead read FFileHead   write FFileHead;
       property Logined    : Boolean   read FLogined    write FLogined;
       property PwdChanged : Boolean   read FPwdChanged write SetPwdChanged;
    end;
    implementationprocedure TUserInfo.CreateLDLFile ;
    begin
     with FFileHead,FFileData do
     begin
       Counter               := 0;
       Index                 := 0;
       UserName              := '';
       UserPwd               := '';
       UserPuw               := tpRead;
       AccessLog.Count       := 1;
       AccessLog.Time[AccessLog.Count-1]:=Now;
     end;
    end;function TUserInfo.GetUserIndex(Name : String):LongInt;
    var
     i : LongInt;
    begin
     Result := 0;
     if Name='' then Exit;
     FileSeek(FFileHandle,0,0);
     FileRead(FFileHandle,FFileHead,Sizeof(TFilehead));
     for i := 1 to FFileHead.Counter do
     begin
       FileRead(FFileHandle,FFileData,Sizeof(TFileData));
       if FFileData.UserName = Name then
       begin
         Result := FFileData.Index ;
         Break;
       end;
     end;
    end;constructor TUserInfo.Create(Fn:String;Mode:Word;Name,Pwd:String);
    var
     Pos : LongInt;
    begin
     FFileName   := Fn;
     FLogined    := False;
     FPwdChanged := False;
     if Mode = fmOpenReadWrite then
     begin
       FFileHandle := FileOpen(FFileName,fmOpenReadWrite);
       Pos := GetUserIndex(Name)-1;         
       LoadLDLFile(Pos);                  
       if (Pwd<>'')and(FFileData.UserPwd = Pwd) then
       begin
         SaveLoginTime;
         FLogined := True;
       end else
       if (Pwd<>'')and(FFileData.UserPwd <> Pwd) then
       begin
         ShowMessage('The User's Password wrong!');
       end;
     end;
     if Mode = fmCreate then
     begin
       FFileHandle := FileCreate(FFileName);
       CreateLDLFile;
     //  FLogined := True;
     end;
    end;destructor TUserInfo.Destroy;
    begin
     if FFileHandle<>-1 then
     begin
       FileClose(FFileHandle);
       FFileHandle:=-1;
       FLogined := False;
     end; inherited;
    end;procedure TUserInfo.Free ;
    begin
     if Assigned(Self) then Destroy;
    end;procedure TUserInfo.LoadLDLFile(Pos: Integer);
    begin
     FileSeek(FFileHandle,0,0);
     FileRead(FFileHandle,FFileHead,Sizeof(TFileHead));
     FileSeek(FFileHandle,(Pos)*Sizeof(TFileData),1);
     FileRead(FFileHandle,FFileData,Sizeof(TFileData));
    end;procedure TUserInfo.SaveLoginTime ;
    begin
     FileSeek(FFileHandle,0-Sizeof(TFileData),1);
     with FFileData do
     begin
       Inc(AccessLog.Count);
       AccessLog.Time[AccessLog.Count-1] := Now;
     end;
     FileWrite(FFileHandle,FFileData,Sizeof(TFileData)); 
    end;procedure TUserInfo.SaveLDLFile(New: Boolean; Pos: Integer);
    var
     AFileData : TFileData;
     Str : String;
    begin
     if New then                   
     begin
       AFileData := FFileData;          
       if GetUserIndex(FFileData.UserName)<>0 then
       begin
         ShowMessage('The User was exists!');
         Exit;
       end;
       FFileData := AFileData;
       with FFileData,FFileHead do       
       begin
         Inc(Counter);
         Index   := Counter;
         AccessLog.Count := 1 ;
         AccessLog.Time[AccessLog.Count-1] := Now;
       end;
       FileSeek (FFileHandle,0,0);
       FileWrite(FFileHandle,FFileHead,Sizeof(TFileHead));
       FileSeek (FFileHandle,0,2);
       FileWrite(FFileHandle,FFileData,Sizeof(TFileData));
     end else
     if (not New)and(Pos<>-1) then       
     begin
       FileSeek (FFileHandle,(Pos-1)*Sizeof(TFileData)+Sizeof(TFileHead),0);
       FileWrite(FFileHandle,FFileData,Sizeof(TFileData));
     end;
    end;procedure TUserInfo.SetPwdChanged(Value: Boolean);
    begin
     FPwdChanged := Value;
    end;end.
    这个单元是我以前写的一个用来保存用户信息,没改过,不太好用,你看看吧,参考一下自己写一个,也许你能用的上,不过加密部分我没写,下面有一个加密的便子,你可以看一下.
    procedure TForm1.Button1Click(Sender:TObject); 
    var 
     s : string[255]; 
     c : array[0..255] of Byte absolute s; 
     i:Integer; 
    begin 
     {加密}  s:='siro_com developers'; 
     For i:=1 to ord(s[0]) do c[i] := 23 XOr c[i]; 
     Label1.Caption:=s;  {解密}  s:=Label1.Caption; 
     For i:=1 to Length(s) do s[i] := char(23 Xor ord(c[i])); 
     Label2.Caption:=s; 
    end;