Home » Tutorials » Datenspeicherung » Streams

Streams

Die Basisklasse TStream

Da in den vorherigen Seiten der Code für TMemoryStream und TFileStream fast identisch war, liegt der Gedanke nahe, dass man dafür einen gemeinsamen Code schreibt.
Da sowohl TMemoryStream als auch TFileStream von der Klasse TStream abgeleitet sind, fällt das nicht schwer. Wenn wir von den Konstruktoren absehen, dann haben wir bisher nur Methoden genutzt, die bereits durch TStream zur Verfügung gestellt werden.
Wir können also große Teile des Codes in eine eigene Methode zusammenfassen, die nicht wissen muss, ob es sich um einen TMemoryStream oder TFileStream handelt.
Zuerst das Speichern:

procedure TFrmMain.WriteToStream(Stream: TStream; Daten: TDatenArray);
var
  I: integer;
  Len: LongInt;
begin
  Len := Length(Daten);
  Stream.Write(Len, SizeOf(Len));

  for I := 0 to Length(Daten) - 1 do
  begin
    Stream.Write(Daten[I].ID, SizeOf(Daten[I].ID));

    Len := Length(Daten[I].Name);
    Stream.Write(Len, SizeOf(Len));
    Stream.Write(PChar(Daten[I].Name)^, Len);
  end;
end;

Unsere neue Methode WriteToStream erwartet die zu speichernden Daten und eine Referenz auf den Stream, in dem die Daten geschrieben werden sollen. Wir können der Methode also jeden Stream übergeben, der von TStream abgeleitet ist. Dies kann TMemoryStream, TFileStream oder irgendeine andere Stream-Klasse sein.
Der restliche Code ist einfach aus der Methode BtnSaveClick geklaut. Es musste nichts umgeschrieben werden.
Dieser Code fehlt dann natürlich in BtnSaveClick.

procedure TFrmMain.BtnSaveClick(Sender: TObject);
var
  Daten: TDatenArray;
  Stream: TStream;
begin
  SetLength(Daten, 2);
  Daten[0].ID := 1;
  Daten[0].Name := 'Ein Name';
  Daten[1].ID := 2;
  Daten[1].Name := 'Ein anderer Name';

  Stream := TFileStream.Create('c:TmpStreamTest.Datei', fmCreate);
  try
    WriteToStream(Stream, Daten);
  finally
    Stream.Free;
  end;
end;

Neu hinzugekommen ist der Aufruf von WriteToStream.
Dementsprechend könnten wir auch eine ReadFormStream-Methode schreiben. Da klar sein dürfte, was da zu machen ist, ersparen wir uns das hier.