Einzelnen Beitrag anzeigen

Thomasl

Registriert seit: 19. Jun 2006
Ort: Vreden
66 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TListe als Datei Speichern

  Alt 16. Nov 2013, 00:18
Ich habe hier mal was ungetestet zusammenkopiert.
Bei einer Class geht das nicht, da wird dann nur der Pointer gespeichert.
Bei normalen Strings muss auch die länge gespeichert werden.
Mit >500Mb/Sec kann ich so bei mir Daten auf SSD Speichern
Wenn die Datenpunkte in TSpielkarte mal erweitert werden sollen ist XML wohl die bessere Wahl


Delphi-Quellcode:
procedure SaveToStream(Stream: TStream);
var
  n: Integer;
  Spielkarte: TSpielkarte;
begin
    // DataCount
    Stream.WriteBuffer(Data.Count, SizeOf(Integer));
    // Data
    for n := 0 to Data.Count - 1 do
    begin
      Spielkarte := Data.Items[n];
      Stream.WriteBuffer(Spielkarte[n], SizeOf(TSpielkarte));
    end;

    //for Spielkarte in Data.List do
    // Stream.WriteBuffer(Spielkarte, SizeOf(TSpielkarte));
end;

procedure SaveToFile(const FileName: String);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmCreate or fmShareDenyWrite);
  try
    SaveToStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure LoadFromStream(Stream: TStream);
var
  n, Count: Integer;
  Spielkarte: TSpielkarte;
begin
    // DataCount
    Stream.ReadBuffer(Count, SizeOf(Integer));
    // Data
    Data.Clear;
    for n := 0 to Count - 1 do
    begin
      Stream.ReadBuffer(Spielkarte, SizeOf(TSpielkarte));
      Data.Add(Spielkarte);
    end;
end;

procedure LoadFromFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
  try
    LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;


Delphi-Quellcode:

type
  TSpielkarte = record
    Value: String[20]; //ShortString
    DateTime: TDateTime;
    Nr: Integer;
  end;

//das geht in Delphi7 noch nicht (Generics)
uses
  generics.defaults, generics.Collections;
...
var
  Data: TList<TSpielkarte>;
...
Data: TList<TSpielkarte>.Create;
...
Data.Free;
...


//zb. String Schreiben
    StrLen := Length(TempString);
    Stream.WriteBuffer(StrLen, SizeOf(Integer));
{$IFDEF ZEROBASEDSTRINGS}
    Stream.WriteBuffer(TempString[0], StrLen * SizeOf(Char));
{$ELSE}
    Stream.WriteBuffer(TempString[1], StrLen * SizeOf(Char));
{$ENDIF}


//zb. String Lesen
    Stream.ReadBuffer(StrLen, SizeOf(Integer));
    if StrLen > -1 then
    begin
      SetLength(TempString, StrLen);
{$IFDEF ZEROBASEDSTRINGS}
      Stream.ReadBuffer(TempString[0], StrLen * SizeOf(Char));
{$ELSE}
      Stream.ReadBuffer(TempString[1], StrLen * SizeOf(Char));
{$ENDIF}
    end
    else
      TempString := '';
Thomas Levering
  Mit Zitat antworten Zitat