程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 使用剪切板[5]: SetAsHandle、GetAsHandle - 自定義格式

使用剪切板[5]: SetAsHandle、GetAsHandle - 自定義格式

編輯:Delphi

 如果要在剪切板中存放自己的格式, 需要用到 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 了.

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved