本例演示把一个组件(TEdit)放入剪切板 又取出(放到一个 TPanel 上)的过程 放入剪切板的方法是个过程: SetComponent(要放入的组件); 取出的方法是个函数: GetComponent(指定属主 指定父窗口): 函数返回取出的组件的句柄 取出以前 最好要判断一下当前剪切板中是不是个组件: HasFormat(CF_COMPONENT); 取出以前还必须要注册要取出的组件类 譬如: RegisterClasses([TEdit]); 准备工作: 在窗体上添加 TEditTPanel 和三个按钮 本例效果图: unitUnit; interface uses WindowsMessagesSysUtilsVariantsClassesGraphicsControlsForms DialogsStdCtrlsExtCtrls; type TForm=class(TForm) Button:TButton; Button:TButton; Button:TButton; Edit:TEdit; Panel:TPanel; procedureButtonClick(Sender:TObject); procedureButtonClick(Sender:TObject); procedureButtonClick(Sender:TObject); end; var Form:TForm; implementation {$R*dfm} usesClipbrd; varobj:TComponent;{用于接受GetComponent的返回值} procedureTFormButtonClick(Sender:TObject); begin ClipboardSetComponent(Edit); TButton(Sender)Caption:=复制; end; procedureTFormButtonClick(Sender:TObject); begin RegisterClasses([TEdit]); ifClipboardHasFormat(CF_COMPONENT)then obj:=ClipboardGetComponent(nilPanel); TButton(Sender)Caption:=粘贴; end; procedureTFormButtonClick(Sender:TObject); begin ifAssigned(obj)thenobjFree; TButton(Sender)Caption:=删除; end; 一般情况下 应该把 RegisterClasses() 过程提前放置(起码可以避免反复执行) 譬如在 FormOnCreate 事件中 大家好像都习惯再提前到 initialization 程序修改如下 unitUnit; interface uses WindowsMessagesSysUtilsVariantsClassesGraphicsControlsForms DialogsStdCtrlsExtCtrls; type TForm=class(TForm) Button:TButton; Button:TButton; Button:TButton; Edit:TEdit; Panel:TPanel; procedureButtonClick(Sender:TObject); procedureButtonClick(Sender:TObject); procedureButtonClick(Sender:TObject); end; var Form:TForm; implementation {$R*dfm} usesClipbrd; varobj:TComponent; procedureTFormButtonClick(Sender:TObject); begin ClipboardSetComponent(Edit); TButton(Sender)Caption:=复制; end; procedureTFormButtonClick(Sender:TObject); begin ifClipboardHasFormat(CF_COMPONENT)then obj:=ClipboardGetComponent(nilPanel); TButton(Sender)Caption:=粘贴; end; procedureTFormButtonClick(Sender:TObject); begin ifAssigned(obj)thenobjFree; TButton(Sender)Caption:=删除; end; initialization RegisterClasses([TEdit]); end 另外 关于剪切板中格式的问题还没有详谈 这里有来了一个 CF_COMPONENT Windows 系统已经定义了十几种剪切板的格式常数 譬如 CF_BITMAPCF_TEXT 等等 不过这里的 CF_COMPONENT 是 Delphi 自定义的 可以猜测 在需要的时候 我们也可以自定义剪切板中的格式 |