2007. szeptember 19., szerda

How to save and load a TList to / from a stream


Problem/Question/Abstract:

Can anyone tell me how to stream a TList to a file? Given:

type
  PassWordItem = class(TObject)
    accountName: string[30];
    userName: string[25];
    passWd: string[10];
  end;

and...

PassWdList: TList;

How do I stream the contents of PassWdList to a file, and subsequently load TList from the file?

Answer:

Lets add a couple of methods to the PassWordItem class:


PassWordItem = class(TObject)
public
  accountName: string[30];
  userName: string[25];
  passWd: string[10];

  procedure SaveToStream(s: TStream);
  constructor CreatefromStream(S: TStream);
end;


With that you can write two procedures (or methods of a TPasswordList class derived from TList):


procedure SavePasswordlist(pwl: TLIst; S: TStream);
var
  i: Integer;
begin
  Assert(Assigned(pwl));
  Assert(Assigned(S));
  i := pwl.count;
  S.Write(i, sizeof(i));
  for i := 0 to pwl.count - 1 do
    PasswordItem(pwl[i]).SaveToStream(S);
end;

procedure LoadPasswordList(pwl: TList; S: TStream);
var
  count, n: Integer;
begin
  Assert(Assigned(pwl));
  Assert(Assigned(S));
  S.Read(count, sizeof(count));
  pwl.Capacity := count;
  for n := 1 to count do
    pwl.Add(PasswordItem.CreatefromStream(S));
end;

procedure Passworditem.SaveToStream(s: TStream);
begin
  Assert(Assigned(S));
  S.Write(accountname, Sizeof(accountname));
  S.Write(username, sizeof(username));
  S.Write(passwd, sizeof(passwd));
end;


constructor CreatefromStream(S: TStream);
begin
  Assert(Assigned(S));
  inherited Create;
  S.Read(accountname, Sizeof(accountname));
  S.Read(username, sizeof(username));
  S.Read(passwd, sizeof(passwd));
end;

Nincsenek megjegyzések:

Megjegyzés küldése