Votre question est confuse ; vous dites que vous voulez le faire sans affecter le presse-papiers du système, mais ensuite (d'après votre propre commentaire à votre question) vous semblez vouloir implémenter quelque chose comme la fonction de MS Office Paste Special
.
Si c'est le premier, comme d'autres l'ont dit, vous ne pouvez pas le faire en utilisant la fonction TClipboard
Vous devez implémenter votre propre wrapper, et le transfert d'informations entre applications sera très difficile.
Si c'est le second, vous pouvez utiliser l'API Windows RegisterClipboardFormat pour définir votre propre format.
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;
Pour placer des informations dans le presse-papiers dans un format personnalisé, vous devez utiliser les éléments suivants GlobalAlloc et GlobalLock pour allouer et verrouiller un bloc de mémoire globale, copier vos données dans ce bloc, déverrouiller le bloc à l'aide de la fonction GlobalUnlock utiliser TClipboard.SetAsHandle
pour transférer le bloc de mémoire dans le presse-papiers. Vous devez ensuite appeler GlobalFree pour libérer le bloc mémoire.
Pour récupérer les éléments dans votre format personnalisé, vous faites essentiellement la même chose, mais en inversant certaines étapes. Vous utilisez GlobalAlloc/GlobalLock comme précédemment, utilisez TClipboard.GetAsHandle
pour récupérer le contenu du presse-papiers, le copier dans une variable locale, puis appeler GlobalFree.
Voici un vieil exemple de mise en place d'un format personnalisé (dans ce cas, du texte RTF) dans le presse-papiers - il provient d'une message de newsgroup par le Dr. Peter Below de TeamB . (Le code et le formatage sont ceux du post original ; je ne l'ai pas testé ni même compilé). Inverser le processus pour le faire sortir devrait être clair d'après mes instructions sur ce qu'il faut changer ci-dessus, et je vous laisse le soin de le faire :)
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;