放入剪切板的方法是个过程: SetComponent(要放入的组件);
取出的方法是个函数: GetComponent(指定属主, 指定父窗口): 函数返回取出的组件的句柄.
取出以前, 最好要判断一下当前剪切板中是不是个组件: HasFormat(CF_COMPONENT);
取出以前还必须要注册要取出的组件类, 譬如: RegisterClasses([TEdit]);
准备工作: 在窗体上添加 TEdit、TPanel 和三个按钮.
本例效果图:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Edit1: TEdit; Panel1: TPanel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} uses Clipbrd; var obj: TComponent; {用于接受 GetComponent 的返回值} procedure TForm1.Button1Click(Sender: TObject); begin Clipboard.SetComponent(Edit1); TButton(Sender).Caption := '复制'; end; procedure TForm1.Button2Click(Sender: TObject); begin RegisterClasses([TEdit]); if Clipboard.HasFormat(CF_COMPONENT) then obj := Clipboard.GetComponent(nil, Panel1); TButton(Sender).Caption := '粘贴'; end; procedure TForm1.Button3Click(Sender: TObject); begin if Assigned(obj) then obj.Free; TButton(Sender).Caption := '删除'; end; end.一般情况下, 应该把 RegisterClasses(); 过程提前放置(起码可以避免反复执行), 譬如在 Form1.OnCreate 事件中;
大家好像都习惯再提前到: initialization. 程序修改如下:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Edit1: TEdit; Panel1: TPanel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} uses Clipbrd; var obj: TComponent; procedure TForm1.Button1Click(Sender: TObject); begin Clipboard.SetComponent(Edit1); TButton(Sender).Caption := '复制'; end; procedure TForm1.Button2Click(Sender: TObject); begin if Clipboard.HasFormat(CF_COMPONENT) then obj := Clipboard.GetComponent(nil, Panel1); TButton(Sender).Caption := '粘贴'; end; procedure TForm1.Button3Click(Sender: TObject); begin if Assigned(obj) then obj.Free; TButton(Sender).Caption := '删除'; end; initialization RegisterClasses([TEdit]); end.另外, 关于剪切板中格式的问题还没有详谈, 这里有来了一个 CF_COMPONENT.
Windows 系统已经定义了十几种剪切板的格式常数, 譬如: CF_BITMAP、CF_TEXT 等等;
不过这里的 CF_COMPONENT 是 Delphi 自定义的, 可以猜测: 在需要的时候, 我们也可以自定义剪切板中的格式.