Home » Tutorials » Datenspeicherung » Binäre Dateien

Binäre Dateien

Einfügen

In dem Rumpfcode gibt es bereits eine leer implementierte Methode für den Menüpunkte Kontakt/Einfügen.
Diese werden wir jetzt mit Leben füllen.

procedure TFrmMain.ActKontaktInsertExecute(Sender: TObject);
var
  Stream: TMemoryStream;
  MemHandle: THandle;
  MemBlock: Pointer;
  ASize: integer;
  Data: TRakBinaryStreamData;
  Kontakt: TKontakt;
begin
  Clipboard.Open;
  try
    if Clipboard.HasFormat(TClipboardFormat) then
    begin // Wenn in der Zwischenablage etwas in richtigen Format vorliegt
      // Eine Referenz auf die Daten in der Zwischenablage anfordern
      MemHandle := Clipboard.GetAsHandle(TClipboardFormat);
      if MemHandle <> 0 then
      begin
        // Die Größe (Anzahl der Bytes) feststellen
        ASize := GlobalSize(MemHandle);
        Stream := nil;
        Data := nil;
        try
          Stream := TMemoryStream.Create;
          Data := TRakBinaryStreamData.Create;

          // Den Inhalt der Zwischenablage fixieren
          MemBlock := GlobalLock(MemHandle);
          try
            // Die Daten in den Stream kopieren
            Stream.Write(MemBlock^, ASize);
          finally
            GlobalUnlock(MemHandle);
          end;

          // Den Inhalt des Streams in das Zwischenformat umwandeln
          Stream.Seek(0, soFromBeginning);
          if Data.LoadFromStream(Stream) = blrOK then
          begin
            if Data.ApplicationName = APPNAME_CLIPBOARD then
            begin // Wenn es wirklich die erwarteten Daten sind
              //Einen neuen Kontakt erzeugen
              Kontakt := FKontakte.NewKontakt;
              // Die Daten des Zwischenformats in den Kontakt übernehmen
              Kontakt.LoadFromBinaryTag(Data);
              // Dafür sorgen, dass alle Kontakte in der Liste angezeigt werden
              // und dass der neue Kontakt selektiert wird
              UpdateList(Kontakt);
            end;
          end;
        finally
          Stream.Free;
          Data.Free;
        end;
      end;
    end;
  finally
    Clipboard.Close;
  end;
end;

Nachdem wir die Zwischenablage geöffnet haben, stellen wir fest, ob sie Daten in unserem Format enthält.
Wir lassen uns das Handle für den Speicher geben, in dem sich die Daten befinden. Nachdem wir einen Zeiger auf den Speicher erhalten haben, kopieren wir den Inhalt in einen MemoryStream.
Das Zwischenformat-Objekt liest den MemoryStream aus. Wenn das geklappt hat und sich auch die erwarteten Daten in der Zwischenablage befanden, dann erzeugen wir einen neuen Kontakt, der seine Daten selbst aus dem Zwischenformat-Objekt auslesen kann.

Kontakt.LoadFromBinaryTag(Data);

Die Methode LoadFromBinaryTag ist wieder genau die selbe Methode, die auch für das Lesen aus Dateien verwendet wird.
Zum Schluss noch etwas Aufräumarbeiten und damit können wir Kontakte auch über die Zwischenablage austauschen.

Der bequemere Weg

Natürlich unterstützt uns die Klasse TRakBinaryStreamData nicht nur beim Einfügen in die Zwischenablage, sondern auch beim Auslesen.
Deswegen können wir die Methode ActKontaktInsertExecute deutlich kürzer schreiben.

procedure TFrmMain.ActKontaktInsertExecute(Sender: TObject);
var
  Data: TRakBinaryStreamData;
  Kontakt: TKontakt;
begin
  Data := TRakBinaryStreamData.Create;
  try
    if Data.LoadFromClipboardFormat(TClipboardFormat) = blcrOK then
    begin
      if Data.ApplicationName = APPNAME_CLIPBOARD then
      begin // Wenn es wirklich die erwarteten Daten sind
        //Einen neuen Kontakt erzeugen
        Kontakt := FKontakte.NewKontakt;
        // Die Daten des Zwischenformats in den Kontakt übernehmen
        Kontakt.LoadFromBinaryTag(Data);
        // Dafür sorgen, dass alle Kontakte in der Liste angezeigt werden
        // und dass der neue Kontakt selektiert wird
        UpdateList(Kontakt);
      end;
    end;
  finally
    Data.Free;
  end;
end;