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

  • 相关阅读:
    那些会阻碍程序员成长的细节[6]
    那些会阻碍程序员成长的细节[5]
    那些会阻碍程序员成长的细节[4]
    那些会阻碍程序员成长的细节[3]
    基于SpringCloud的Microservices架构实战案例-在线API管理
    主机地址变更后,dubbo请求时依旧会寻址旧IP的问题
    基于SpringCloud的Microservices架构实战案例-配置文件属性内容加解密
    基于SpringCloud的Microservices架构实战案例-架构拆解
    程序员创业必读的几本书
    Java基础---二分查找
  • 原文地址:https://www.cnblogs.com/del/p/1137426.html
Copyright © 2011-2022 走看看