Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

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

  Alt 10. Mär 2012, 16: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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat