本例演示把一個組件(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 自定義的, 可以猜測: 在需要的時候, 我們也可以自定義剪切板中的格式.