你的问题有些混乱;你说你想在不影响系统剪贴板的情况下完成,但是(从你对自己问题的评论中可以看出)你似乎想实现类似于MS Office的“粘贴特殊”功能。
如果是第一种情况,正如其他人所说,你不能使用
TClipboard
包装器来做到这一点;你必须自己实现,并且在应用程序之间传递信息将非常困难。
如果是第二种情况,你可以使用Windows API
RegisterClipboardFormat 来定义自己的格式。
type
TForm1=class(TForm)
YourCustomFormat: Word;
procedure FormCreate(Sender: TObject);
end;
implementation
constructor TForm1.FormCreate(Sender: TObject);
begin
YourCustomFormat := RegisterClipboardFormat('Your Custom Format Name');
end;
为了将信息以自定义格式放入剪贴板中,您需要使用
GlobalAlloc和
GlobalLock来分配和锁定全局内存块,将数据复制到该块中,使用
GlobalUnlock解锁该块,使用
TClipboard.SetAsHandle
将内存块传输到剪贴板。然后需要调用
GlobalFree来释放内存块。
要检索自定义格式中的内容,您基本上需要执行相同的步骤,但需要反转一些步骤。您可以像之前一样使用GlobalAlloc/GlobalLock,使用
TClipboard.GetAsHandle
检索剪贴板的内容,将其复制到本地变量中,然后调用GlobalFree。
这是一个旧的例子,演示了如何将自定义格式(在本例中为RTF文本)放入剪贴板中 - 它来自Dr. Peter Below(TeamB成员)的新闻组帖子。 (代码和格式来自原始帖子,我没有测试过它甚至编译过它。)根据我上面的说明,将其取回的过程应该很清楚,我将让您自行解决。 :)
procedure TForm1.BtnSetRTFClick(Sender: TObject);
Const
testtext: PChar = '{\rtf1\ansi\pard\plain 12{\ul 44444}}';
testtext2: PChar = '{\rtf1\ansi'+
'\deff4\deflang1033{\fonttbl{\f4\froman\fcharset0\fprq2 Times New Roman;}}'
+'\pard\plain 12{\ul 44444}}';
flap: Boolean = False;
Var
MemHandle: THandle;
rtfstring: PChar;
begin
If flap Then
rtfstring := testtext2
Else
rtfstring := testtext;
flap := not flap;
MemHandle := GlobalAlloc( GHND or GMEM_SHARE, StrLen(rtfstring)+1 );
If MemHandle <> 0 Then Begin
try
StrCopy( GlobalLock( MemHandle ), rtfstring );
GlobalUnlock( MemHandle );
With Clipboard Do Begin
Open;
try
AsText := '1244444';
SetAsHandle( CF_RTF, MemHandle );
finally
Close;
end;
End;
Finally
GlobalFree( MemHandle );
End;
End
Else
MessageDlg('Global Alloc failed!',
mtError, [mbOK], 0 );
end;
TClipboard
仅是Windows剪贴板API的VCL包装器。根据我的第一条评论,它应该被用作单例类。 - Andreas Rejbrand