2017-08-23 35 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