ok, mi era sfuggito.
Per "salvare in binario" ti posso postare del codice "veramente as-is" (mi
vergogno quasi), che avevo realizzato quando ero proprio agli inizi.
Però funziona ed esegue lo streaming in lettura/scrittura, in formato
"raw", di una lista di oggetti. Magari ti può servire come spunto per
qualcosa...
unit uClasses;
interface
uses
Classes, Contnrs;
procedure SaveList(const AFilename: string; lstObj: TObjectList);
procedure LoadList(const AFilename: string; lstObj: TObjectList);
type
TMain = class(TPersistent)
public
ID: Integer;
Name: string;
Items: TObjectList; //che conterrà solo oggetti TItem
procedure Load(Reader: TReader);
procedure Save(Writer: TWriter);
constructor Create;
destructor Destroy; override;
end;
TItem = class(TPersistent)
public
Date: TDateTime;
Text: string;
Exists: Boolean;
procedure Load(Reader: TReader);
procedure Save(Writer: TWriter);
end;
implementation
uses SysUtils;
procedure SaveList(const AFilename: string; lstObj: TObjectList);
var
Stream: TFileStream;
Writer: TWriter;
i: Integer;
begin
Writer:= nil; //perchè nil???
if FileExists(AFilename) then DeleteFile(AFilename);
Stream:= TFileStream.Create(AFilename, fmCreate);
try
Writer:= TWriter.Create(Stream, 4096); //perchè 4096 cioè 2 alla 12?
with Writer do
begin
WriteListBegin;
for i:= 0 to
lstObj.Count - 1 do
TMain(lstObj[i]).Save(Writer);
WriteListEnd;
end
finally
Writer.Free;
Stream.Free;
end;
end;
procedure LoadList(const AFilename: string; lstObj: TObjectList);
var
Stream: TFileStream;
Reader: TReader;
i: Integer;
AMain: TMain;
begin
Reader:= nil;
if not FileExists(AFilename) then Exit;
Stream:= TFileStream.Create(AFilename, fmOpenRead);
try
Reader:= TReader.Create(Stream, 4096); //perchè 4096 cioè 2 alla 12?
with Reader do
begin
ReadListBegin;
while not EndOfList do
begin
AMain:= TMain.Create;
AMain.Load(Reader);
lstObj.Add(AMain);
end;
ReadListEnd;
end;
finally
Reader.Free;
Stream.Free;
end;
end;
procedure TMain.Save(Writer: TWriter);
var
i: Integer;
begin
with Writer do
begin
WriteInteger(ID);
WriteString(Name);
WriteListBegin;
if Assigned(Items) then
for i:= 0 to
Items.Count - 1 do
TItem(Items[i]).Save(Writer);
WriteListEnd;
end;
end;
procedure TMain.Load(Reader: TReader);
var
AnItem: TItem;
begin
with Reader do
begin
ID:= ReadInteger;
Name:= ReadString;
ReadListBegin;
while not EndOfList do
begin
AnItem:= TItem.Create;
AnItem.Load(Reader);
Items.Add(AnItem);
end;
ReadListEnd;
end;
end;
procedure TItem.Save(Writer: TWriter);
begin
with Writer do
begin
WriteDate(Date);
WriteString(Text);
WriteBoolean(Exists);
end;
end;
procedure TItem.Load(Reader: TReader);
begin
with Reader do
begin
Date:= ReadDate;
Text:= ReadString;
Exists:= ReadBoolean;
end;
end;
constructor TMain.Create;
begin
Items:= TObjectList.Create;
end;
destructor TMain.Destroy;
begin
Items.Free;
inherited Destroy;
end;
end.