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.