如果要在剪下板中存放自己的格式, 需要用到 SetAsHandle、GetAsHandle 兩個方法.
SetAsHandle(用於剪下板的格式ID, 資料的記憶體控制代碼); 看這個方法的兩個參數都有點麻煩.
自訂剪下板格式要用 RegisterClipboardFormat 函數; 第二個參數是記憶體控制代碼而不是記憶體位址, 能分配記憶體並返回控制代碼的函數暫時我只知道 GlobalAlloc、GlobalReAlloc 兩個函數, 使用它們分配用於剪下板的記憶體時還須使用 GMEM_DDESHARE 標誌.
GetAsHandle(用於剪下板的格式ID) 方法返回的是資料所在記憶體的控制代碼.
通過記憶體控制代碼擷取擷取記憶體位址, 還要用到 GlobalLock 函數.
本例自訂了結構 TMyRec, 並指定了對應的剪下板格式 CF_MY.
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end;var Form1: TForm1;implementation{$R *.dfm}uses Clipbrd;Type TMyRec = record name: string[8]; age : Byte; end;var CF_MY: Word;procedure TForm1.FormCreate(Sender: TObject);begin CF_MY := RegisterClipboardFormat('My Format');end;procedure TForm1.Button1Click(Sender: TObject);var PRec: ^TMyRec; Data: THandle;begin Data := GlobalAlloc(GMEM_DDESHARE, SizeOf(TMyRec)); PRec := GlobalLock(Data); PRec.name := '張三'; PRec.age := 99; GlobalUnlock(Data); Clipboard.SetAsHandle(CF_MY, Data);end;procedure TForm1.Button2Click(Sender: TObject);var PRec: ^TMyRec; Data: THandle;begin if not Clipboard.HasFormat(CF_MY) then Exit; Data := Clipboard.GetAsHandle(CF_MY); PRec := GlobalLock(Data); ShowMessageFmt('%s %d 歲', [PRec.name, PRec.age]); {張三 99 歲} GlobalUnlock(Data);end;end.//這個例子忘了 GlobalFree 了.