Hmm, irgendwie ist da was schiefgegangen.
So, daß hier hatte ich noch im Zwischenspeicher. (k.A. was ich daran noch geändert hatte)
Delphi-Quellcode:
var stream: TStream;
writer: TWriter;
ip, ig: Integer;
begin
Stream := TFilestream.create(Dateiname,fmcreate);
try
Writer := TWriter.Create(Stream, 4096);
try
Writer.WriteInteger(aktuelleVersion);
for ip := Low(Person)
to High(Person)
do begin
Writer.WriteString(Person[
ip].
name);
Writer.WriteInteger(Integer(Person[
ip].Geschlecht));
Writer.WriteInteger(Person[
ip].groesse);
Writer.WriteListBegin;
for ig := Low(Person[
ip].gewichte)
to High(Person[
ip].gewichte)
do begin
Writer.WriteDate(Person[
ip].gewichte[ig].iDatum);
Writer.WriteDouble(Person[
ip].gewichte[ig].iGewicht);
end;
Writer.WriteListEnd;
end;
finally
writer.Free;
end;
finally
Stream.Free;
end;
end;
Delphi-Quellcode:
Writer.WriteListBegin;
for ig := Low(Person[
ip].gewichte)
to High(Person[
ip].gewichte)
do begin
Writer.WriteDate(Person[
ip].gewichte[ig].iDatum);
Writer.WriteDouble(Person[
ip].gewichte[ig].iGewicht);
end;
Writer.WriteListEnd;
Reader.ReadListBegin;
ig := Low(Person[
ip].gewichte);
while Reader.NextValue <> vaNull
do begin
Writer.WriteDate(Person[
ip].gewichte[ig].iDatum);
Writer.WriteDouble(Person[
ip].gewichte[ig].iGewicht);
Inc(ig);
end;
Reader.ReadListEnd;
Und letztendlich kann man es auch noch so wie die
VCL machen und die Bezeichner gleich mit Dokumentieren.
Delphi-Quellcode:
var stream: TStream;
writer: TWriter;
ip, ig: Integer;
begin
Stream := TFilestream.create(Dateiname,fmcreate);
try
Writer := TWriter.Create(Stream, 4096);
try
Writer.WriteSignature
Writer.WriteIdent('
FileType');
Writer.WriteUTF8Str('
ThorZten.Personenliste');
Writer.WriteIdent('
Version');
Writer.WriteInteger(aktuelleVersion);
Writer.WriteIdent('
Personen');
Writer.WriteListBegin;
for ip := Low(Person)
to High(Person)
do begin
Writer.WriteListBegin;
Writer.WriteIdent('
Name');
Writer.WriteUTF8Str(Person[
ip].
name);
Writer.WriteIdent('
Geschlecht');
Writer.WriteInteger(Ord(Person[
ip].geschlecht));
Writer.WriteIdent('
Größe');
Writer.WriteInteger(Person[
ip].groesse);
Writer.WriteIdent('
Gewichte');
Writer.WriteListBegin;
for ig := Low(Person[
ip].gewichte)
to High(Person[
ip].gewichte)
do begin
Writer.WriteListBegin;
Writer.WriteIdent('
Datum');
Writer.WriteDate(Person[
ip].gewichte[ig].iDatum);
Writer.WriteIdent('
Gewicht');
Writer.WriteDouble(Person[
ip].gewichte[ig].iGewicht);
Writer.WriteListEnd;
end;
Writer.WriteListEnd;
Writer.WriteListEnd;
end;
Writer.WriteListEnd;
finally
writer.Free;
end;
finally
Stream.Free;
end;
end;
Und schon könnte man die Datei auch auslesen, selbst wenn man das Format nicht kennt.
Beim Einlesen kann man quasi Versionsabhänig den richtigen Wert auslesen, da sich über den Ident prüfen läßt, welcher Wert das genau ist.