AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TListe als Datei Speichern

Ein Thema von Vaporizor · begonnen am 15. Nov 2013 · letzter Beitrag vom 16. Nov 2013
Antwort Antwort
Thomasl

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

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
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz