剪贴板的编程

时间:2010-02-27 18:00:13  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:是以函数方式提供的,这两个对象一个是Printer(TPrinter类型,包含Printers单元就可调),另一个就是Clipboard(TClipboard类型,包含Clipbrd单元就可调用)。用函数而不是全局变量会令实际的变量存贮在单元的实现部分而不是接口部分,这样就永远不能对它赋值。    现在介绍Clipboard的编程。    Clipboard是由系统自...
  正文:Delphi中有一些全局对象,永远不要去构造它们的实例。其中有两个对象是以全局
变量的方式提供的,这两个变量一个是Application(TApplication类型,包含Forms单元即
可调用),另一个是Screen(TScreen类型,包含Forms单元即可调用)。而另外两个对象是以
函数方式提供的,这两个对象一个是Printer(TPrinter类型,包含Printers单元就可调),
另一个就是Clipboard(TClipboard类型,包含Clipbrd单元就可调用)。用函数而不是全局变
量会令实际的变量存贮在单元的实现部分而不是接口部分,这样就永远不能对它赋值。
    现在介绍Clipboard的编程
    Clipboard是由系统自动实例化的一个对象,通过该对象可以操作剪贴板,可以存取和
清除剪贴板的内容。不过一般不显式地操作剪贴板,而是通过操作其它的控件或由系统自动
更新剪贴板内容。如基于TCustomEdit的控件(如TEdit, TMemo,TRichEdit等)就有直接操作
剪贴板的方法:CopyToClipboard,CutToClipboard和PasterFromClipboard。事实上在
TCustomEdit运行时,Ctrl+C, Ctrl+X, Ctrl+V自动定义成了操作剪贴板的热键,不用
编写任何代码。剪贴板的内容可以通过查询HasFormat获得其格式。Windows系统支持三
种基础格式:CF_TEXT, CF_BITMAP和CF_METAFILEPICT,分别表示文本、位图和元文件图
象,其它的格式难以预知,因为任何新的格式都需要向Windows注册新类型。Delphi就注
册了两种类型:CF_PICTURE(TPicture类型,包括TIcon, TBitmap和TMetafile)和
CF_COMPONENT(TComponent类型)。全部的格式可以通过Windows API的枚举函数
CountClipboardFormats和EnumClipboardFormats测知,甚至还可以用GetClipboardFormatName
查出每种格式的名称。
    Clipboard的基类是TPersistent,说明Clipboard不能处理任何Windows消息。剪贴板
是由Windows运行中的所有任务共同操作的,当有任何一个任务修改剪贴板内容时,不能
自动通知需要监测剪贴板状态的窗口。如果工具栏中有一个粘贴的按钮,不能动态地修改
这个按钮的活动状态。有两种方法可以解决这个问题:一个是重载主窗体的Windows消息过
程,并在OnCreate和OnDestroy添加和注销剪贴板观察窗体链。另一个是设计一个剪贴板监
控器部件,需要时添加到主窗体中即可。显然第二种方法较好。

unit ClipMonitor;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, clipbrd;

type
  TClipFormat = (cfNone, cfText, cfBitmap, cfMetaFilePict,
    cfPicture, cfComponent, cfOther);

  TClipMonitor = class(TComponent)
  private
    FHandle, FNextViewerHandle: THandle;
    FActive: Boolean;
    FOnChange:TNotifyEvent;
    OldWndProc, NewWndProc: Pointer;
    procedure SetActive(Value: Boolean);
    function GetFormat: TClipFormat;
    procedure SetFormat(Value: TClipFormat);
  protected
    procedure NewWndMethod(var msg: TMessage);
    procedure Loaded; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Active: Boolean read FActive write SetActive default False;
    property Format: TClipFormat read GetFormat write SetFormat stored False;
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('System', [TClipMon]);
end;

constructor TClipMon.Create(AOwner: TComponent);
begin
  if not (AOwner is TForm) then
    raise Exception.CreateFmt('''%s'' is not a Form', [AOwner.Name])
  else if AOwner = nil then
    raise Exception.Create('No Windowized Owner'); 《剪贴板的编程》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/12946.html


关键字:

关于《剪贴板的编程》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td