本例演示把一个组件(TEdit)放入剪切板, 又取出(放到一个 TPanel 上)的过程.
放入剪切板的方法是个过程: 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 自定义的, 可以猜测: 在需要的时候, 我们也可以自定义剪切板中的格式.