Delphi Clipboard[5] SetComponent、GetComponent -组件在剪贴板中的操作
{该文首发于博客园 滔Roy,无须授权即可转发,请自觉保留头部申明}
Delphi Clipboard[5] SetComponent、GetComponent -组件在剪贴板中的操作
1、SetComponent //将组件复制到剪贴板
1 2 3 4 5 6 7 8 9 10 11 12 | procedure TClipboard . SetComponent(Component: TComponent); var MemStream: TMemoryStream; begin MemStream := TMemoryStream . Create; try MemStream . WriteComponent(Component); SetBuffer(CF_COMPONENT, MemStream . Memory^, MemStream . Size); finally MemStream . Free; end ; end ; |
2、GetComponent //从剪贴板中检索组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | function TClipboard . GetComponent(Owner, Parent: TComponent): TComponent; var Data: THandle; DataPtr: Pointer ; MemStream: TMemoryStream; Reader: TReader; begin Result := nil ; Open; try Data := GetClipboardData(CF_COMPONENT); if Data = 0 then Exit; DataPtr := GlobalLock(Data); if DataPtr = nil then Exit; try MemStream := TMemoryStream . Create; try MemStream . WriteBuffer(DataPtr^, GlobalSize(Data)); MemStream . Position := 0 ; Reader := TReader . Create(MemStream, 256 ); try Reader . Parent := Parent; Result := Reader . ReadRootComponent( nil ); try if Owner <> nil then Owner . InsertComponent(Result); except Result . Free; raise ; end ; finally Reader . Free; end ; finally MemStream . Free; end ; finally GlobalUnlock(Data); end ; finally Close; end ; end ; |
- 使用GetComponent检索存储在剪贴板上的组件。
- 所有者成为检索组件的所有者,父级成为其父级。Owner通常是一个表单,但两个参数都可以是nil(Delphi)或NULL(C++)。
- 在从剪贴板读取类之前,必须通过调用RegisterClass来注册它。如果试图读取未注册的类,则会出现EClassNotFound异常。
3、示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | //复制Editvar Cpt:TComponent; begin Clipboard . SetComponent(Edit1); { 将按钮复制到剪贴板 } if Clipboard . HasFormat(CF_COMPONENT) then begin Cpt:=Clipboard . GetComponent(Self, GroupBox1); TEdit(Cpt).Text:= '这是滔Roy复制的Edit1' ; TEdit(Cpt).Left:= 20 ; TEdit(Cpt).Top:= 20 ; end ; end ; //复制按钮 var Cpt:TComponent; begin Clipboard . SetComponent(BitBtnTest); { 将按钮复制到剪贴板 } BitBtnTest . Caption := 'TaoRoyButton1' ; { 重命名仍在表单上的按钮 } //现在从剪贴板中检索按钮并将其添加到GroupBox1 //请注意,剪贴板按钮名为BitBtnTest,而源按钮已重命名为"TaoRoyButton1" if Clipboard . HasFormat(CF_COMPONENT) then begin Cpt:=Clipboard . GetComponent(Self, GroupBox1); TBitBtn(Cpt).Left:= 20 ; TBitBtn(Cpt).Top:= 50 ; end ; end ; |
注意:这里用到了 HasFormat(CF_COMPONENT) ,而CF_COMPONENT是Delphi内置的组件剪贴板格式
创建时间:2022.04.14 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2021-04-14 Delphi 自定义组件/控件图标
2021-04-14 Delphi Classes.TComponentState - 组件当前状态