2017-08-23 3 views
3

Embarcadero RAD Studio VCL hat die TClipboard.HasFormat Methode, mit einer Verwendung z.B. Clipboard.HasFormat(CF_TEXT) oder Clipboard.HasFormat(CF_BITMAP) etc ..Wie erkennt man das RICHTEXT-Format in der Zwischenablage zuverlässig?

Aber ich jeden unterstützten CF_RTF oder CF_RICHTEXT nicht format Descriptor finden, die in der Zwischenablage ein Rich-Text-Format gibt.

Also habe ich formatierten Text in Microsoft WordPad erstellt und in die Zwischenablage kopiert. Dann habe ich ein Zwischenablage-Spion-Programm die Formate in der Zwischenablage zu inspizieren:

enter image description here

Diese Listen 3 RichText- Formate mit den Format-Deskriptoren C078, C16B und C1A5.

Sind diese Formatdeskriptoren universell oder abhängig vom individuellen System oder von der aktuellen Situation? D. h., Kann ich generell Clipboard.HasFormat($C078) verwenden, um ein RichText-Format in der Zwischenablage zu erkennen? Oder gibt es eine andere Methode?

Antwort

9

Kann ich Clipboard.HasFormat($C078) allgemein jedes RichText- Format in der Zwischenablage zu erkennen?

Nein, Sie müssen das RTF-Zwischenablageformat über die Funktion RegisterClipboardFormat registrieren. Der zurückgegebene Wert wird vom System generiert und kann variieren.

Registriert ein neues Zwischenablageformat. Dieses Format kann dann als gültiges Zwischenablageformat verwendet werden. Wenn ein registriertes Format mit dem angegebenen Namen bereits vorhanden ist, wird kein neues Format registriert und der Rückgabewert gibt das vorhandene Format an. Dadurch können mehr als eine Anwendung die Daten mit demselben registrierten Zwischenablageformat kopieren und einfügen.

var 
    CF_RTF: UINT; 
... 
initialization 
    CF_RTF := RegisterClipboardFormat('Rich Text Format'); 

Dann für überprüfen:

if Clipboard.HasFormat(CF_RTF) then ... 
{ or // if Windows.IsClipboardFormatAvailable(CF_RTF) then ... } 

Edit: Nach dem Lesen der Dokumentation: How to Use Rich Edit Clipboard Operations

Die Konstante CF_RTF ist bereits in RichEdit Einheit als deklariert:

CF_RTF     = 'Rich Text Format'; 
CF_RTFNOOBJS   = 'Rich Text Format Without Objects'; 
CF_RETEXTOBJ   = 'RichEdit Text and Objects'; 

Es könnte also eine bessere Idee sein, eine andere Benennung für den zurückgegebenen Wert RegisterClipboardFormat zu verwenden. z.B.

uses RichEdit; 
... 
var 
    CF_RICHTEXT: UINT; 
... 
initialization 
    CF_RICHTEXT := RegisterClipboardFormat(RichEdit.CF_RTF); 

Und:

if Clipboard.HasFormat(CF_RICHTEXT) then ... 

Hinweis: Es gibt bereits ein paar Zwischenablage-Formate reserviert wie CF_TEXT (= 1), CF_BITMAP (= 2) etc ... aber die „CF_RTF "oder" CF_RICHTEXT "ist keiner von ihnen. es ist ein benutzerdefiniertes Format, das von der gemeinsamen Steuerung RICHEDIT verwendet wird und wie bereits erwähnt über RegisterClipboardFormat registriert wird.

+0

Ich habe genau das getan, weil es auf vielen Websites empfohlen wird. Dann habe ich den formatierten Text von WordPad wieder in die Zwischenablage kopiert. Aber das Zwischenspion-Spionprogramm listet kein 'CF_RTF'-Format auf. – user1580348

+1

@user, Sorry, ich verstehe nicht, was du meinst. meinst du, dass Spion Spion nicht explizit "CF_RTF" als Beschreibung anzeigen? Wenn das der Fall ist, könnten Sie Ihre Variable "CF_RICHTEXT" oder was auch immer nennen, es ist egal. Der Formatbezeichner ist sowieso ein String, d.h. "Rich Text Format". im Gegensatz zu 'CF_BITMAP', das ein System const (2) ist. 'CF_RTF' ist ein * benutzerdefiniertes * Format. – kobik

+0

Also ist die Zeichenfolge 'Rich Text Format' eine Systemkonstante? Andernfalls könnte die Zwischenablage es nicht als eine ID für RichText erkennen? – user1580348

Verwandte Themen