Re: Salvare una variabile su file (guisto x avere le idee chiare...)
  Home FAQ Contact Sign in
it.comp.lang.delphi only
 
Advanced search
POPULAR GROUPS

more...

 Up
Re: Salvare una variabile su file (guisto x avere le idee chiare...)         

Group: it.comp.lang.delphi · Group Profile
Author: Mauro Falzari
Date: Nov 27, 2006 12:40

Il giorno 27 novembre 2006, VeGeTa_CuBe ha scritto:
> Eh eh, lo conosco a memoria quel thred, l'ho iniziato io ;-))
> Cmq, immagino tu ti riferisca al post in cui parli del salvataggio
> delle opzioni in XML, giusto?
> Pero' io vorrei salvare in binario, e senza dover cambiare troppo il
> codice gia' scritto (che non e' poco, visto che questo prog e'
> l'evoluzione di un prog precedente)...

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.

--
Mauro Falzari

"Non è morto ciò che in eterno può attendere,
e col passar di strane ere, anche la morte muore".
(Howard Phillips Lovecraft, 1890-1937)
no comments
diggit! del.icio.us! reddit!