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 := '';