是否可能,如果是这样,您将如何实施自己的剪贴板?
通过这个我的意思是能够像Windows剪贴板那样复制和粘贴任何东西,但实际上没有干扰系统剪贴板.
为了更好地了解这是我尝试过的:
uses
ClipBrd;
...
procedure TMainForm.actCopyExecute(Sender: TObject);
var
MyClipboard: TClipboard;
begin
MyClipboard := TClipboard.Create;
try
MyClipboard.AsText := 'Copy this text';
finally
MyClipboard.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
这是因为它会将字符串"复制此文本"复制到剪贴板,但它会覆盖Windows剪贴板上的内容.
以上必须只创建一个Windows剪贴板的实例,而不是实际创建自己的.
请注意,自定义剪贴板可以保存任何数据而不仅仅是纯文本.它应该与Windows剪贴板一样工作,但不会干扰它(丢失它上面的任何内容).
怎么能实现这一目标?
谢谢.
你的问题令人困惑; 你说你想在不影响系统剪贴板的情况下这样做,但是(从你自己的评论到你的问题)你似乎想要实现类似MS Office的东西Paste Special.
如果它是第一个,正如其他人所说,你不能使用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;
Run Code Online (Sandbox Code Playgroud)
要以自定义格式将信息放入剪贴板,您必须使用GlobalAlloc和GlobalLock分配和锁定全局内存块,将数据复制到该块中,使用GlobalUnlock解锁块,用于TClipboard.SetAsHandle将内存块传输到剪贴板.然后,您需要调用GlobalFree来释放内存块.
要以自定义格式检索内容,基本上会执行相同的操作,只需颠倒几个步骤即可.您像以前一样使用GlobalAlloc/GlobalLock,用于TClipboard.GetAsHandle检索剪贴板的内容,将其复制到本地变量,然后调用GlobalFree.
这是一个将自定义格式(在本例中为RTF文本)放入剪贴板的旧示例 - 它来自TeamB的 Peter Below博士的新闻组帖子.(代码和格式是来自原始帖子的;我没有对它进行测试,甚至没有对其进行编译.)从上面的更改内容的指示中反转过程以使其恢复,我将其留给您锻炼身体.:)
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2264 次 |
| 最近记录: |