使用剪切板[3]: SetComponent、GetComponent

本例演示把一个组件(TEdit)放入剪切板, 又取出(放到一个 TPanel 上)的过程.

放入剪切板的方法是个过程: SetComponent(要放入的组件);
取出的方法是个函数: GetComponent(指定属主, 指定父窗口): 函数返回取出的组件的句柄.

取出以前, 最好要判断一下当前剪切板中是不是个组件: HasFormat(CF_COMPONENT);

取出以前还必须要注册要取出的组件类, 譬如: RegisterClasses([TEdit]);

准备工作: 在窗体上添加 TEdit、TPanel 和三个按钮.

本例效果图:

使用剪切板[3]: SetComponent、GetComponent

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 自定义的, 可以猜测: 在需要的时候, 我们也可以自定义剪切板中的格式.

你可能感兴趣的:(component)