Home » Tutorials » Datenspeicherung » Binäre Dateien

Binäre Dateien

Methode SpeichernAls

In dem Rumpfprogramm gibt es bereits die Methode SpeichernAls. Diese gibt momentan nur false zurück. Hier werden wir jetzt das Speichern in eine Datei implementieren.
Es gibt noch weitere Speichern-Methoden, die bereits voll implementiert sind. Da diese nur das beim Speichern übliche Vorgeplänkel durchführen und dann SpeichernAls aufrufen, werden wir diese hier nicht weiter besprechen.

function TFrmMain.SpeichernAls(FileName: string): boolean;
var
SreamData: TRakBinaryStreamData;
begin
Result := InputToPuffer(SelectedKontakt);
if Result then
begin
try
SreamData := TRakBinaryStreamData.Create;
try
SreamData.ApplicationName := ‚RakBinaryStreamData Tutorial‘;
SreamData.ApplicationVersion := ‚1.0.0‘;

FKontakte.SaveToBinaryTag(SreamData.AddTag(‚Kontakte‘));

SreamData.SaveToFile(FileName);
finally
SreamData.Free;
end;
Datei := FileName;
HasChanged := false;
except
Application.MessageBox(‚Die Datei konnte nicht gespeichert ‚+
werden.’+#13+’Wahrscheinlich wollten sie auf einen ‚+
’nicht beschreibaren Datenträger schreiben (z.B. CD-ROM)’+#13
+ ‚oder der Datenträger ist voll.‘,
PChar(FileName), MB_OK);
Result := false;
end;

CheckEnabled;
end;
end;
Result := InputToPuffer(SelectedKontakt);
Das InputToPuffer stellt nur sicher, dass alle Eingaben korrekt sind und hat mit dem eigentlichen Speichern nichts zu tun.

SreamData := TRakBinaryStreamData.Create;

TRakBinaryStreamData ist eine Klasse aus der Unit RakBinaryStreamData. Diese Klasse ist der Container für das Zwischenformat. Sie bildet den Wurzelknoten des Baumes, in dem wir jetzt alle zu speichernden Daten einhängen.

SreamData.ApplicationName := 'RakBinaryStreamData Tutorial';

Hier legen wir den Namen des Programmes ab, damit wir beim Laden feststellen können, ob die Daten wirklich für unser Programm bestimmt sind.

SreamData.ApplicationVersion := '1.0.0';

Hier legen wir die Version des Programms ab. Wir werten die zwar nirgends aus, aber vielleicht interessiert sich einmal eine zukünftige Version des Kontaktmanagers dafür.

FKontakte.SaveToBinaryTag(SreamData.AddTag('Kontakte'));

FKontakte ist der Container für alle Kontakte. Er hat die Klasse TKontakte, die man in der Unit Kontakt findet. Das AddTag(‚Kontakte‘) bewirkt dass ein neuer Unterknoten erzeugt wird. Dieser bekommt den Namen Kontakte. Der neue Unterknoten hat die Klasse TRakBinaryTag, die wir in der Unit RakBinaryStreamData finden.
Alle Knoten sind von der Klasse TRakBinaryTag. Die einzige Ausnahme bildet der Wurzelknoten, der die Klasse TRakBinaryStreamData hat. TRakBinaryStreamData ist aber von TRakBinaryTag abgeleitet.
Der neue Unterknoten wird an die Methode SaveToBinaryTag von FKontakte übergeben. In diesen Knoten kann dann FKontakte alle seine Kontakte ablegen.
Wir hätten nicht extra einen eigenen Unterknoten erzeugen müssen. Wir hätten auch StreamData übergeben können.

FKontakte.SaveToBinaryTag(SreamData);

Wir wollen aber für zukünftige Programmversionen gerüstet sein und verhindern, dass es zu Konflikten kommt. StreamData ist der Knoten, in dem sich das Hauptprogramm austoben kann. Der Unterknoten Kontakte, steht dagegen FKontakte zur freien Verfügung. Es kann also nicht aus Versehen passieren, dass beide mit dem gleichen Element arbeiten wollen.
Das SaveToBinaryTag werden wir auf der nächsten Seite implementieren.

SreamData.SaveToFile(FileName);

Da jetzt alle Daten in dem Zwischenformat abgelegt sind, können wir dieses in einer Datei speichern.
Der restliche Code ist wieder das übliche Geplänkel, das man beim Speichern einer Datei durchführt.