Delphi Clipboard[6] SetAsHandle、GetAsHandle 自定义格式,以指定格式处理数据
{该文首发于博客园 滔Roy,无须授权即可转发,请自觉保留头部申明}
Delphi Clipboard[6] SetAsHandle、GetAsHandle 自定义格式,以指定格式处理数据
1、SetAsHandle //将句柄以给定格式放置在剪贴板上(将指定句柄表示的数据放在剪贴板上)
procedure SetAsHandle(Format: Word; Value: THandle);
procedure TClipboard.SetAsHandle(Format: Word; Value: THandle);
begin
Open;
try
Adding;
SetClipboardData(Format, Value);
finally
Close;
end;
end;
- SetAsHandle使用指定格式将指定句柄(值)表示的数据写入剪贴板。
- 注意:不要在将句柄传递给SetAsHandle后删除它。该句柄属于剪贴板,剪贴板将释放它。
2、GetAsHandle //以指定格式处理的原始窗口从剪贴板返回数据(以指定格式返回剪贴板中数据的Windows句柄)
function TClipboard.GetAsHandle(Format: Word): THandle;
begin
Open;
try
Result := GetClipboardData(Format);
finally
Close;
end;
end;
- GetAsHandle使用Windows句柄从剪贴板中检索数据。
- GetAsHandle返回的句柄不归应用程序所有,只有在剪贴板打开时才有效。如果需要更长时间,请将数据复制到另一个句柄。
3、示例
Type
TMyTest = record
Name: string[100];
ID:Integer;
end;
var
CF_TAOROY:Word;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Data: THandle;
DataPtr: Pointer;
PRec: ^TMyTest;
begin
Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, SizeOf(TMyTest));
try
PRec := GlobalLock(Data);
DataPtr := GlobalLock(Data);
try
PRec.ID:=100;
PRec.Name:='滔Roy';
Clipboard.SetAsHandle(CF_TAOROY, Data);
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data); //注意:由GlobalAlloc函数分配给剪贴板的内存,在传递数据的过程中,只有发生异常时才需要调用GlobalFree来释放内存,Win会接管对剪贴板内存的管理
raise;
end
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
PRec: ^TMyTest;
Data: THandle;
begin
if not Clipboard.HasFormat(CF_TAOROY) then Exit;
Data := Clipboard.GetAsHandle(CF_TAOROY);
PRec := GlobalLock(Data);
try
Memo1.Lines.Add(IntToStr(PRec.ID));
Memo1.Lines.Add(PRec.name);
finally
GlobalUnlock(Data);
end;
end;
initialization
CF_TAOROY := RegisterClipboardFormat('TaoRoy Format'); //自定义格式
注意:由GlobalAlloc函数分配给剪贴板的内存,在传递数据的过程中,只有发生异常时才需要调用GlobalFree来释放内存,Win会接管对剪贴板内存的管理
创建时间:2022.04.14 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!