Ваш вопрос сбивает с толку; вы говорите, что хотите сделать это, не затрагивая системный буфер обмена, но затем (из вашего собственного комментария к вашему вопросу) вы, похоже, хотите реализовать что-то вроде Paste Special
в 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-текста) в буфер обмена - это из сообщения группы новостей от доктора Питера Белоу из 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;