Clipboard/de
│
Deutsch (de) │
English (en) │
magyar (hu) │
русский (ru) │
Zurück zu den Zusätzlichen Informationen.
Dieser Artikel beschäftigt sich mit der Windowsprogrammierung.
Instanz-Erzeugung
Die unit Clipbrd muss in die uses-Klausel aufgenommen werden. Damit werden zwei Möglichkeiten zur Verfügung gestellt, wie man Zugriff auf die Zwischenablage erhalten kann.
Der klassische Weg wäre ein Objekt von TClipboard zu erzeugen:
uses
Clipbrd;
var
Clipboard: TClipboard;
begin
Clipboard := TClipboard.Create();
Clipboard.AsText := 'Hallo Pascal!';
end.
Die Unit Clipbrd bietet aber auch eine Funktion Clipboard() an, die eine (Singleton-)Instanz von TClipboard zurückliefert, die sogleich weiterverwendet werden kann:
uses
Clipbrd;
begin
Clipboard.AsText := 'Hallo Pascal!';
end.
Der Unterschied ist: Die Instanziierung im ersten Beispiel gibt ein Objekt zurück das wirklich die System-Zwischenablage widerspiegelt (also z.B. die für alle Programme verfügbare Zwischenablage unter Windows). Erzeugt man aber eine weitere Instanz, dann stellt diese eine eigenständige, unabhängige (lokale) Zwischenablage dar. Änderungen die über die erste Instanz an der System-Zwischenablage vorgenommen werden erscheinen nicht in den Inhalten der zweiten Instanz (und umgekehrt).
Im zweiten Beispiel wird immer eine einzige, vordefinierte Instanz zurückgeliefert. Alle Zugriffe darüber, auch aus anderen Units heraus, haben Auswirkungen auf die System-Zwischenablage und die Änderungen sind daher auch von überall aus sichtbar.
Aufbau der Zwischenablage
Die TClipboard-Klasse bildet die Zwischenablage wie ein Dictionary (auch Map genannt) ab. Als Schlüssel dienen die TClipboardFormat id-Nummern, die mit den jeweiligen TStreams verbunden sind, die die Daten des Formats halten. Beispielsweise is die id für einfachen Text (Unicode) die Nummer 13, HTML hat die Nummer 49374. Zumindest unter Windows haben die Formate auch einen String-Bezeichner der leichter zu lesen ist. Für Text wäre dies "text/plain" oder "HTML Format". Die meisten Bild-Formate nutzen die MIME/type-Notation "image/" + Dateiendung, also z.B. "image/png", "image/jpg", usw. Unter Linux können die Werte jedoch ganz andere sein.
Die Zwischenablage kann Daten in verschiedenen Formaten gleichzeitig anbieten. Beim "Einfügen"-Vorgang kann die Ziel-Applikation entscheiden, welches Format sie weiter verarbeiten möchte. So könnte MS Paint z.B. das Format "image/bmp" extrahieren, GIMP vielleicht "image/png" usw.
Formate der Zwischenablage
Eigene Formate
Es ist möglich selbst Formate für allemöglichen Zwecke zu definieren. Dazu muss nur eine noch nicht belegte Id-Nummer über TClipboard registriert werden und die Daten dafür hinzugefügt werden. TClipboard bietet dazu folgende Methoden an:
function AddFormat(FormatID: TClipboardFormat; Stream: TStream): Boolean;
function AddFormat(FormatID: TClipboardFormat; var Buffer; Size: Integer): Boolean;
Um abzufragen, welche Formate für die Daten gerade verfügbar sind bietet TClipboard an:
function GetFormat(FormatID: TClipboardFormat; Stream: TStream): Boolean;
function HasFormat(FormatID: TClipboardFormat): Boolean;
function HasFormatName(const FormatName: string): Boolean;
procedure SupportedFormats(List: TStrings);
property FormatCount: Integer;
property Formats[Index: Integer]: TClipboardFormat;
(* Diese Liste ist nicht vollständig *)
Weitere Details dazu können der Code-Dokumentation entnommen werden.
Es können auch Listener an der Zwischenablage registriert werden, damit die eigene Applikation auf Änderungen der Inhalte reagieren kann.
Microsoft Formattypen der Zwischenablage
Die Microsoft Formattypen sind in der Unit Clipbrd vordefiniert.
Der Inhalt der Windows-Zwischenablage kann unter anderem folgende Formate haben:
Konstante | Wert | Beschreibung |
---|---|---|
CF_TEXT | 1 | Unformatierter Ansi-Text (UTF-8). |
CF_BITMAP | 2 | Handle auf eine Windows Bitmap-Grafik. |
CF_METAFILEPICT | 3 | Handle auf eine Windows Metafile-Grafik. |
CF_SYLK | 4 | Handle auf einen Microsoft Symbolic-Link. |
CF_DIF | 5 | Handle auf ein Software Arts "Data Interchange Format". |
CF_TIFF | 6 | Handle auf eine Tagged-Image File Format. |
CF_OEMTEXT | 7 | Mit dem OEM-Zeichensatz formatierter Text. (Dieser Zeichensatz wird z. B. von PC-Dos und MS-Dos verwendet.) |
CF_DIB | 8 | Handle auf eine Windows Bitmap-Grafik. |
CF_PALETTE | 9 | Handle auf eine Farbpalette. |
CF_PENDATA | 10 | Wird im Zusammenhang mit den Stift-Erweiterungen von Microsoft Windows verwendet. |
CF_RIFF | 11 | Multimediadaten (Audiodateien) im Resource Interchange Datei Format (= Resource Interchange File Format). |
CF_WAVE | 12 | Audiodaten in einem der Standard-Wave-Formate wie 11 kHz oder 22 kHz PCM. |
CF_UNICODETEXT | 13 | Text im Unicode-Text-Format (UTF-16). |
CF_ENHMETAFILE | 14 | Ein Handle auf eine erweiterte Metadatei (HENHMETAFILE). |
CF_HDROP | 15 | Ein Handle auf eine Dateiliste, im Zusammenhang mit Drag-And-Drop. |
CF_LOCALE | 16 | Enthält einen numerischen Wert in dem das Gebietsschema (Sprachcode und Ländercode) hinterlegt sind. Diese Information dient dazu, die Zeichensatzcodierung im Zwischenablageformat CF_TEXT zu ermitteln. Das Betriebssystem verwendet die Codepage CF_LOCALE, um Daten aus dem Zwischenablageformat CF_TEXT implizit in das Zwischenablageformat CF_UNICODETEXT konvertieren. |
CF_OWNERDISPLAY | 128 | Owner Display Format. |
CF_DSPTEXT | 129 | Text, dessen Anzeigeformat mit einem eigenen Format verbunden ist (CF_PRIVATEFIRST, CF_PRIVATELAST). |
CF_DSPBITMAP | 130 | Bitmap, deren Anzeigeformat mit einem eigenen Format verbunden ist (CF_PRIVATEFIRST, CF_PRIVATELAST). |
CF_DSPMETAFILEPICT | 131 | Zwischendatei, deren Anzeigeformat mit einem eigenen Format verbunden ist (CF_PRIVATEFIRST, CF_PRIVATELAST). |
CF_DSPENHMETAFILE | 142 | Erweiterte Zwischendatei, deren Anzeigeformat mit einem eigenen Format verbunden ist (CF_PRIVATEFIRST, CF_PRIVATELAST). |
CF_PRIVATEFIRST | 512 | Dient in der Zwischenablage dem Setzen von privaten Datenformaten. |
CF_PRIVATELAST | 767 | Dient in der Zwischenablage dem Setzen von privaten Datenformaten. |
CF_GDIOBJFIRST | 768 | Dient in der Zwischenablage dem Setzen von privaten Datenformaten. |
CF_GDIOBJLAST | 1023 | Dient in der Zwischenablage dem Setzen von privaten Datenformaten. |
CF_PICTURE | 49674 | Handle auf ein Objekt vom Datentyp TPicture. |
CF_OBJECT | 49685 | Handle auf ein beliebiges Objekt. |
Vordefinierte Lazarusformattypen für die Zwischenablage
Folgende Formattypen sind für das Arbeiten mit der Zwischenablage in der Unit LCLType vordefiniert:
TPredefinedClipboardFormat | MIME type |
---|---|
pcfText | text/plain |
pcfBitmap | image/bmp |
pcfPixmap | image/xpm |
pcfIcon | image/lcl.icon |
pcfPicture | image/lcl.picture |
pcfMetaFilePict | image/lcl.metafilepict |
pcfObject | application/lcl.object |
pcfComponent | application/lcl.component |
pcfCustomData | application/lcl.customdata |
Arbeiten mit den Windowsformattypen
Das Format der Zwischenablage abfragen
Im Beispiel wird abgefragt, ob der Inhalt der Zwischenablage Textformat hat.
...
If Clipboard.HasFormat(CF_TEXT) then ...
...
Leeren der Zwischenablage
...
Clipboard.Clear; // Leert die Zwischenablage
...
Arbeiten mit Texten ohne Textformatierung
Holt den Inhalt der Zwischenablage als unformatierten Text:
...
Procedure subProzedur1;
var
strPuffer: string;
begin
...
strPuffer := Clipboard.AsText;
...
end;
...
Kopiert den Inhalt eines Strings in die Zwischenablage:
...
procedure subProzedur2;
var
strPuffer: string;
begin
...
strPuffer := 'Hallo Welt';
Clipboard.AsText := strPuffer;
...
end;
...
Ein Bild aus TImage in die Zwischenablage kopieren
...
uses
Clipbrd, ...;
...
procedure subProzedur3;
begin
...
Clipboard.Assign(Form1.Image1.Picture.Bitmap);
...
end;
...
oder
...
uses
Clipbrd, ...;
...
procedure subProzedur4;
begin
...
Form1.Image1.Picture.Bitmap.SaveToClipboardFormat(CF_BITMAP);
...
end;
...
Einen Screenshot erstellen und in die Zwischenablage kopieren
...
uses
Clipbrd, Graphics, Windows, SysUtils, ...;
...
procedure subProzedur5;
var
picBild: TPicture;
hdcBildschirm: HDC;
begin
try
// erstellt das Objekt picBild
picBild := TPicture.Create;
// erstellt den Screenshot und übergibt die Adresse des Screenshots
hdcBildschirm := GetDC(0);
// kopiert den Inhalt ab Adresse hdcBildschirm nach picBild
picBild.Bitmap.LoadFromDevice(hdcBildschirm);
// Freigabe von DC
ReleaseDC(0, hdcBildschirm);
// kopiert den Screenshot in die Zwischenablage
// dieser kann dann als Picture oder als Bitmap
// aus der Zwischenablage geholt werden
Clipboard.Assign(picBild);
finally
// gibt die lokale Variable picBild wieder frei
FreeandNil(picBild);
end;
end;
...
Ein Bild aus der Zwischenablage in ein TImage kopieren
...
uses
Clipbrd, ...;
...
procedure subProzedur6;
begin
...
// Prüft, ob sich ein Bildformat in der Zwischenablage befindet
if (Clipboard.HasFormat(CF_BITMAP)) or (Clipboard.HasFormat(CF_PICTURE)) then
// Ist ein Bild im vorgegebenen Format vorhanden, dann wird es geladen
Form1.Image1.Picture.Assign(Clipboard);
...
end;
...
--Olaf 05:03, 8 July 2013 (UTC)