Ваш вопрос смущает; вы говорите, что хотите сделать это, не затрагивая системный буфер обмена, но затем (из вашего собственного комментария к вашему вопросу) вы, похоже, хотите реализовать что-то вроде 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;
Чтобы поместить данные в буфер обмена в пользовательском формате, вы должны использовать GlobalAlloc и GlobalLock выделить и зафиксировать глобальный блок памяти, копировать данные в этот блок, разблокировать блок, используя GlobalUnlock, используйте TClipboard.SetAsHandle
для переместите блок памяти в буфер обмена. Затем вам необходимо позвонить GlobalFree, чтобы освободить блок памяти.
Чтобы получить вещи в своем обычном формате, вы делаете в основном то же самое с несколькими шагами в обратном порядке. Вы используете GlobalAlloc/GlobalLock, как и раньше, используйте TClipboard.GetAsHandle
для извлечения содержимого буфера обмена, копирования его в локальную переменную и последующего вызова GlobalFree.
Вот старый пример ввода пользовательского формата (в данном случае текста RTF) в буфер обмена - это от newsgroup post от 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;
Вы должны сделать 'Clipboard.AsText: = 'Скопировать этот текст';'; нет необходимости создавать новый экземпляр «TClipboard». –
Да, но мне нужен мой собственный буфер обмена, а не Windows. –
Да, я знаю. Мой комментарий был вне темы. –