电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

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


发布日期:2020/8/29
 

本例演示把一个组件(TEdit)放入剪切板 又取出(放到一个 TPanel 上)的过程

放入剪切板的方法是个过程: SetComponent(要放入的组件);

取出的方法是个函数: GetComponent(指定属主 指定父窗口): 函数返回取出的组件的句柄

取出以前 最好要判断一下当前剪切板中是不是个组件: HasFormat(CF_COMPONENT);

取出以前还必须要注册要取出的组件类 譬如: RegisterClasses([TEdit]);

准备工作: 在窗体上添加 TEditTPanel 和三个按钮

本例效果图:

unitUnit;

interface

uses

WindowsMessagesSysUtilsVariantsClassesGraphicsControlsForms

DialogsStdCtrlsExtCtrls;

type

TForm=class(TForm)

Button:TButton;

Button:TButton;

Button:TButton;

Edit:TEdit;

Panel:TPanel;

procedureButtonClick(Sender:TObject);

procedureButtonClick(Sender:TObject);

procedureButtonClick(Sender:TObject);

end;

var

Form:TForm;

implementation

{$R*dfm}

usesClipbrd;

varobj:TComponent;{用于接受GetComponent的返回值}

procedureTFormButtonClick(Sender:TObject);

begin

ClipboardSetComponent(Edit);

TButton(Sender)Caption:=复制;

end;

procedureTFormButtonClick(Sender:TObject);

begin

RegisterClasses([TEdit]);

ifClipboardHasFormat(CF_COMPONENT)then

obj:=ClipboardGetComponent(nilPanel);

TButton(Sender)Caption:=粘贴;

end;

procedureTFormButtonClick(Sender:TObject);

begin

ifAssigned(obj)thenobjFree;

TButton(Sender)Caption:=删除;

end;

一般情况下 应该把 RegisterClasses() 过程提前放置(起码可以避免反复执行) 譬如在 FormOnCreate 事件中

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

unitUnit;

interface

uses

WindowsMessagesSysUtilsVariantsClassesGraphicsControlsForms

DialogsStdCtrlsExtCtrls;

type

TForm=class(TForm)

Button:TButton;

Button:TButton;

Button:TButton;

Edit:TEdit;

Panel:TPanel;

procedureButtonClick(Sender:TObject);

procedureButtonClick(Sender:TObject);

procedureButtonClick(Sender:TObject);

end;

var

Form:TForm;

implementation

{$R*dfm}

usesClipbrd;

varobj:TComponent;

procedureTFormButtonClick(Sender:TObject);

begin

ClipboardSetComponent(Edit);

TButton(Sender)Caption:=复制;

end;

procedureTFormButtonClick(Sender:TObject);

begin

ifClipboardHasFormat(CF_COMPONENT)then

obj:=ClipboardGetComponent(nilPanel);

TButton(Sender)Caption:=粘贴;

end;

procedureTFormButtonClick(Sender:TObject);

begin

ifAssigned(obj)thenobjFree;

TButton(Sender)Caption:=删除;

end;

initialization

RegisterClasses([TEdit]);

end

另外 关于剪切板中格式的问题还没有详谈 这里有来了一个 CF_COMPONENT

Windows 系统已经定义了十几种剪切板的格式常数 譬如 CF_BITMAPCF_TEXT 等等

不过这里的 CF_COMPONENT 是 Delphi 自定义的 可以猜测 在需要的时候 我们也可以自定义剪切板中的格式

上一篇:如何在各种开发语言中调用WEBService

下一篇:利用浏览器实现程序界面与实现的分离