2017-08-23 37 views
3

Embarcadero RAD Studio VCL的方法有TClipboard.HasFormat,使用方法如下: Clipboard.HasFormat(CF_TEXT)Clipboard.HasFormat(CF_BITMAP)等。如何在剪貼板上可靠地檢測RICHTEXT格式?

但是我沒有找到任何支持CF_RTFCF_RICHTEXT格式描述符表示剪貼板的富文本格式。

因此,我在Microsoft寫字板中創建了一些格式化的文本並將其複製到剪貼板。然後我用剪貼板間諜程序檢查剪貼板上的格式:

enter image description here

此列出3種富文本格式的格式描述符C078C16BC1A5

這些格式描述符是通用的還是依賴於單個系統或從當前情況?也就是說,我通常可以使用Clipboard.HasFormat($C078)來檢測剪貼板上的任何RichText格式嗎?還是有另一種方法?

回答

9

可我一般使用Clipboard.HasFormat($C078)檢測在剪貼板上的任何 富文本格式?

不,您需要通過RegisterClipboardFormat函數註冊RTF剪貼板格式。返回值由系統生成,可能會有所不同。

註冊一個新的剪貼板格式。這種格式可以用作 有效的剪貼板格式。

如果已經存在具有指定名稱的註冊格式,則不會註冊新的 格式,並且返回值會標識現有的 格式。這使得多個應用程序能夠使用相同的註冊剪貼板格式來複制和粘貼數據 。

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

然後檢查:

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

編輯:閱讀文檔後:How to Use Rich Edit Clipboard Operations

CF_RTFRichEdit單元已經被聲明爲:

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

因此,對返回的值RegisterClipboardFormat使用其他命名可能是一個更好的主意。例如

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

和:

if Clipboard.HasFormat(CF_RICHTEXT) then ... 

注:現在已經有幾個保留系統剪貼板格式,如CF_TEXT(= 1),CF_BITMAP(= 2)等等,但「CF_RTF 「或」CF_RICHTEXT「不是其中之一。它是由RICHEDIT公共控制使用的自定義格式,並且已經通過RegisterClipboardFormat註冊,如前所述。

+0

我已經完成了這個工作,因爲它是在很多網站上推薦的。然後我再將格式化文本從寫字板複製到剪貼板。但剪貼板間諜程序不會列出任何'CF_RTF'格式。 – user1580348

+1

@user,對不起,我不明白你的意思。你的意思是剪貼板間諜沒有明確顯示「CF_RTF」作爲描述?如果是這種情況,你可以命名你的變量「'CF_RICHTEXT'」或其他,這沒關係。格式標識符無論如何都是字符串,即「富文本格式」。而不是CF_BITMAP這是一個系統常量(2)。 'CF_RTF'是* custom *格式。 – kobik

+0

那麼字符串「富文本格式」是一個系統常量?否則,剪貼板無法將其識別爲RichText的標識符? – user1580348