zoukankan      html  css  js  c++  java
  • 使用剪切板[3]: SetComponent、GetComponent

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

  • 相关阅读:
    【Javascript】javascript学习 二十二 JavaScript 对象简介
    【Javascript】javascript学习 二十六 JavaScript Boolean(逻辑)对象
    【Javascript】javascript学习 二十九 JavaScript HTML DOM 对象
    【Javascript】javascript学习 二十八 JavaScript RegExp 对象
    【Javascript】javascript学习 二十一 JavaScript 指导方针
    【Javascript】javascript学习 二十三 JavaScript 字符串(String)对象
    【Javascript】javascript学习 三十 JavaScript 浏览器检测
    【Javascript】javascript学习 二十五 JavaScript Array(数组)对象
    【Javascript】javascript学习 二十四 JavaScript Date(日期)对象
    【Javascript】javascript学习 二十七 JavaScript Math(算数)对象
  • 原文地址:https://www.cnblogs.com/del/p/1137426.html
Copyright © 2011-2022 走看看