Home » Tutorials » Datenspeicherung » Binäre Dateien

Binäre Dateien

Methode DateiLaden

Das Rumpfprogramm enthält bereits die Methode DateiLaden. Diese ist bis jetzt aber noch leer. Die werden wir nun mit Leben füllen.

procedure TFrmMain.DateiLaden;
var  StreamData: TRakBinaryStreamData;
  Tag: TRakBinaryTag;
  R: integer;
  DoIt: boolean;
begin
  if OdgKontakte.Execute then
  begin
    DoIt := true;
    if HasChanged then
    begin
      R := Application.MessageBox('Änderungen speichern?',
      'Neue Kontakte laden', MB_YESNOCANCEL);
      if R = IDCANCEL  then
        DoIt := false
      else if R = IDYES then
        DoIt := Speichern(true) <> IDCANCEL;
    end;
    if DoIt then
    begin
      StreamData := TRakBinaryStreamData.Create;
      try
        if (StreamData.LoadFromFile(OdgKontakte.FileName) <> blrOK)
          or (StreamData.ApplicationName <>
          'RakBinaryStreamData Tutorial') then
        begin
          ShowMessage('Unbekanntes Datei-Format');
        end
        else
        begin
          Tag := StreamData.FindFirstTag('Kontakte');
          if Tag <> nil then
            FKontakte.LoadFromBinaryTag(Tag);
          Datei := OdgKontakte.FileName;
          HasChanged := false;
        end;
      finally
        StreamData.Free;
      end;
      UpdateList(nil);
    end;
  end;
end;

Zuerst wird der Öffnen-Dialog gezeigt und danach das übliche Geplänkel beim Laden von Dateien durchgeführt. Für uns wird es erst interessant, wenn die Instanz von TRakBinaryStreamData erzeugt wird.

StreamData := TRakBinaryStreamData.Create;

Wir haben bereits zum Speichern die Klasse TRakBinaryStreamData verwendet. Deshalb verwenden wir sie auch zum Laden der Daten.

if (StreamData.LoadFromFile(OdgKontakte.FileName) <> blrOK)    or (StreamData.ApplicationName <> 'RakBinaryStreamData Tutorial')    then

StreamData soll sich selbständig aus der Datei OdgKontakte.FileName rekonstruieren. Wenn das geklappt hat, dann gibt die Methode LoadFromFile den Wert blrOK zurück. Es gibt noch einige Fehlerwerte, anhand derer man genauer erkennen kann, warum das Laden der Datei nicht geklappt hat.

TRakBinaryLoadResult = (    blrOK,          // Die Daten konnten geladen werden    blrErrVersion,  // Es ist zwar das richtige Datenformat,    //aber in einer Version, die nicht unterstützt wird    blrErrFormat,   // Der Stream enthält kein bekanntes Datenformat    blrErrCorrupt); // Die Daten im Stream sind defekt

Uns interessiert aber letztendlich nur, ob das Laden überhaupt geklappt hat.

Selbst wenn das Laden geklappt hat, heißt das noch lange nicht, dass die Daten wirklich für uns bestimmt sind. TRakBinaryStreamData kann alle Dateien laden, solange sie von einem TRakBinaryStreamData-Objekt erzeugt wurden. Dabei ist es egal, von welchen Programm das gemacht wurde. Es ist egal, ob die Datei Kontakte enthält oder vielleicht die Daten einer technischen Zeichnung. Deshalb gibt es auch ein Tool, mit dem jede Datei betrachtet und sogar verändert werden kann, die durch ein TRakBinaryStreamData-Objekt erzeugt wurde. Dieses Tool kann man von der Download-Seite herunter laden.

Deshalb überprüfen wir mit (StreamData.ApplicationName <> ‚RakBinaryStreamData Tutorial‘) auch noch, ob die Daten wirklich für uns bestimmt sind.

Wir hatten die Daten der Kontakte in einem Unterknoten gespeichert. Deshalb müssen wir uns jetzt diesen Unterknoten besorgen.

Tag := StreamData.FindFirstTag('Kontakte');

Mit FindFirstTag kann man sich den ersten direkten Unterknoten geben lassen, der einem bestimmten Namen hat. Bei Knoten ist es ja möglich, dass mehreren Unterknoten den gleichen Namen zu geben. Da wir hier aber nur genau einen Unterknoten mit dem Namen ‚Kontakte‘ haben ist dies automatisch auch der erste.

Tag := StreamData.FindFirstTag('Kontakte');

Sicherheitshalber prüfen wir, ob es den Knoten tatsächlich gibt.

FKontakte.LoadFromBinaryTag(Tag);

Da sich die Kontakte selbst gespeichert haben, sollen sie sich auch selbst laden. Die Methode LoadFromBinaryTag implementieren wir im nächsten Abschnitt.

Der Rest ist dann wieder das übliche Geplänkel beim Laden von Dateien.