熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

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

2013-11-11 21:04:24  來源: Delphi編程 

  本例演示把一個組件(TEdit)放入剪切板 又取出(放到一個 TPanel 上)的過程

  放入剪切板的方法是個過程: SetComponent(要放入的組件);

  取出的方法是個函數: GetComponent(指定屬主 指定父窗口): 函數返回取出的組件的句柄

  取出以前 最好要判斷一下當前剪切板中是不是個組件: HasFormat(CF_COMPONENT);

  取出以前還必須要注冊要取出的組件類 譬如: RegisterClasses([TEdit]);

  准備工作: 在窗體上添加 TEditTPanel 和三個按鈕

  本例效果圖:

  

  unit Unit;

  interface

  uses
 Windows Messages SysUtils Variants Classes Graphics Controls Forms
 Dialogs StdCtrls ExtCtrls;

  type
 TForm = class(TForm)
  Button: TButton;
  Button: TButton;
  Button: TButton;
  Edit: TEdit;
  Panel: TPanel;
  procedure ButtonClick(Sender: TObject);
  procedure ButtonClick(Sender: TObject);
  procedure ButtonClick(Sender: TObject);
 end;

  var
 Form: TForm;

  implementation

  {$R *dfm}

  uses Clipbrd;

  var obj: TComponent; {用於接受 GetComponent 的返回值}

  procedure TFormButtonClick(Sender: TObject);
begin
 ClipboardSetComponent(Edit);
 TButton(Sender)Caption := 復制;
end;

  procedure TFormButtonClick(Sender: TObject);
begin
 RegisterClasses([TEdit]);
 if ClipboardHasFormat(CF_COMPONENT) then
  obj := ClipboardGetComponent(nil Panel);
 TButton(Sender)Caption := 粘貼;
end;

  procedure TFormButtonClick(Sender: TObject);
begin
 if Assigned(obj) then objFree;
 TButton(Sender)Caption := 刪除;
end;

  一般情況下 應該把 RegisterClasses() 過程提前放置(起碼可以避免反復執行) 譬如在 FormOnCreate 事件中

  大家好像都習慣再提前到 initialization 程序修改如下

unit Unit;

  interface

  uses
 Windows Messages SysUtils Variants Classes Graphics Controls Forms
 Dialogs StdCtrls ExtCtrls;

  type
 TForm = class(TForm)
  Button: TButton;
  Button: TButton;
  Button: TButton;
  Edit: TEdit;
  Panel: TPanel;
  procedure ButtonClick(Sender: TObject);
  procedure ButtonClick(Sender: TObject);
  procedure ButtonClick(Sender: TObject);
 end;

  var
 Form: TForm;

  implementation

  {$R *dfm}

  uses Clipbrd;

  var obj: TComponent;

  procedure TFormButtonClick(Sender: TObject);
begin
 ClipboardSetComponent(Edit);
 TButton(Sender)Caption := 復制;
end;

  procedure TFormButtonClick(Sender: TObject);
begin
 if ClipboardHasFormat(CF_COMPONENT) then
  obj := ClipboardGetComponent(nil Panel);
 TButton(Sender)Caption := 粘貼;
end;

  procedure TFormButtonClick(Sender: TObject);
begin
 if Assigned(obj) then objFree;
 TButton(Sender)Caption := 刪除;
end;

  initialization
 RegisterClasses([TEdit]);

  end

    另外 關於剪切板中格式的問題還沒有詳談 這裡有來了一個 CF_COMPONENT

  Windows 系統已經定義了十幾種剪切板的格式常數 譬如 CF_BITMAPCF_TEXT 等等

  不過這裡的 CF_COMPONENT 是 Delphi 自定義的 可以猜測 在需要的時候 我們也可以自定義剪切板中的格式


From:http://tw.wingwit.com/Article/program/Delphi/201311/8415.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.