Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#10

AW: Speichern einer Kombination aus dynamischen Arrays, statischem Array und Record

  Alt 10. Mär 2012, 15:45
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat