随笔 - 2146  文章 - 97 评论 - 11767 trackbacks - 253

本例演示把一个组件(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 自定义的, 可以猜测: 在需要的时候, 我们也可以自定义剪切板中的格式.

posted on 2008-04-04 14:48  万一  阅读(...)  评论(...编辑  收藏