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;