如果要在剪切板中存放自己的格式, 需要用到 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 了.
posted on 2008-04-04 23:09  万一  阅读(3715)  评论(4编辑  收藏  举报