如果要在剪切板中存放自己的格式, 需要用到 SetAsHandle、GetAsHandle 兩個方法.
SetAsHandle(用於剪切板的格式ID, 數據的內存句柄); 看這個方法的兩個參數都有點麻煩.
自定義剪切板格式要用 RegisterClipboardFormat 函數; 第二個參數是內存句柄而不是內存地址, 能分配內存並返回句柄的函數暫時我只知道 GlobalAlloc、GlobalReAlloc 兩個函數, 使用它們分配用於剪切板的內存時還須使用 GMEM_DDESHARE 標志.
GetAsHandle(用於剪切板的格式ID) 方法返回的是數據所在內存的句柄.
通過內存句柄獲取獲取內存地址, 還要用到 GlobalLock 函數.
本例自定義了結構 TMyRec, 並指定了對應的剪切板格式 CF_MY.
unit Unit1;
interface
uses
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 了.