请问如何取得剪贴版的中内容?(20分)

  • 主题发起人 主题发起人 fffddd
  • 开始时间 开始时间
在Delphi中有一些全局对象,永远不要去构造它们的实例。其中有两个对象是以全局 <br>变量的方式提供的,这两个变量一个是Application(TApplication类型,包含Forms单元即 <br>可调用),另一个是Screen(TScreen类型,包含Forms单元即可调用)。而另外两个对象是以 <br>函数方式提供的,这两个对象一个是Printer(TPrinter类型,包含Printers单元就可调), <br>另一个就是Clipboard(TClipboard类型,包含Clipbrd单元就可调用)。用函数而不是全局变 <br>量会令实际的变量存贮在单元的实现部分而不是接口部分,这样就永远不能对它赋值。 <br>现在介绍Clipboard的编程。 <br>Clipboard是由系统自动实例化的一个对象,通过该对象可以操作剪贴板,可以存取和 <br>清除剪贴板的内容。不过一般不显式地操作剪贴板,而是通过操作其它的控件或由系统自动 <br>更新剪贴板内容。如基于TCustomEdit的控件(如TEdit, TMemo,TRichEdit等)就有直接操作 <br>剪贴板的方法:CopyToClipboard,CutToClipboard和PasterFromClipboard。事实上在 <br>TCustomEdit运行时,Ctrl+C, Ctrl+X, Ctrl+V自动定义成了操作剪贴板的热键,不用 <br>编写任何代码。剪贴板的内容可以通过查询HasFormat获得其格式。Windows系统支持三 <br>种基本格式:CF_TEXT, CF_BITMAP和CF_METAFILEPICT,分别表示文本、位图和元文件图 <br>象,其它的格式难以预知,因为任何新的格式都需要向Windows注册新类型。Delphi就注 <br>册了两种类型:CF_PICTURE(TPicture类型,包括TIcon, TBitmap和TMetafile)和 <br>CF_COMPONENT(TComponent类型)。全部的格式可以通过Windows API的枚举函数 <br>CountClipboardFormats和EnumClipboardFormats测知,甚至还可以用GetClipboardFormatName <br>查出每种格式的名称。 <br>Clipboard的基类是TPersistent,说明Clipboard不能处理任何Windows消息。剪贴板 <br>是由Windows运行中的所有任务共同操作的,当有任何一个任务修改剪贴板内容时,不能 <br>自动通知需要监测剪贴板状态的窗口。如果工具栏中有一个粘贴的按钮,不能动态地修改 <br>这个按钮的活动状态。有两种方法可以解决这个问题:一个是重载主窗体的Windows消息过 <br>程,并在OnCreate和OnDestroy添加和注销剪贴板观察窗体链。另一个是设计一个剪贴板监 <br>控器部件,需要时添加到主窗体中即可。显然第二种方法较好。 <br><br>unit ClipMonitor; <br><br>interface <br><br>uses <br>Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, <br>StdCtrls, clipbrd; <br><br>type <br>TClipFormat = (cfNone, cfText, cfBitmap, cfMetaFilePict, <br>cfPicture, cfComponent, cfOther); <br><br>TClipMonitor = class(TComponent) <br>private <br>FHandle, FNextViewerHandle: THandle; <br>FActive: Boolean; <br>FOnChange:TNotifyEvent; <br>OldWndProc, NewWndProc: Pointer; <br>procedure SetActive(Value: Boolean); <br>function GetFormat: TClipFormat; <br>procedure SetFormat(Value: TClipFormat); <br>protected <br>procedure NewWndMethod(var msg: TMessage); <br>procedure Loaded; override; <br>public <br>constructor Create(AOwner: TComponent); override; <br>destructor Destroy; override; <br>published <br>property Active: Boolean read FActive write SetActive default False; <br>property Format: TClipFormat read GetFormat write SetFormat stored False; <br>property OnChange: TNotifyEvent read FOnChange write FOnChange; <br>end; <br><br>procedure Register; <br><br>implementation <br><br>procedure Register; <br>begin <br>RegisterComponents('System', [TClipMon]); <br>end; <br><br>constructor TClipMon.Create(AOwner: TComponent); <br>begin <br>if not (AOwner is TForm) then <br>raise Exception.CreateFmt('''%s'' is not a Form', [AOwner.Name]) <br>else if AOwner = nil then <br>raise Exception.Create('No Windowized Owner'); <br>inherited Create(AOwner); <br>FHandle := (Owner as TForm).Handle; <br>FNextViewerHandle := 0; <br>FActive := False; <br>FNextViewerHandle := SetClipboardViewer(FHandle); <br>if not (csDesigning in ComponentState) then begin <br>NewWndProc := MakeObjectInstance(NewWndMethod); <br>OldWndProc := Pointer(SetWindowLong(FHandle, GWL_WNDPROC, <br>LongInt(NewWndProc))); <br>end else begin <br>NewWndProc := nil; <br>OldWndProc := nil; <br>end; <br>end; <br><br>destructor TClipMon.Destroy; <br>begin <br>ChangeClipboardChain(FHandle, FNextViewerHandle); <br>if Assigned(NewWndProc) then begin <br>SetWindowLong(FHandle, GWL_WNDPROC, Longint(OldWndProc)); <br>FreeObjectInstance(NewWndProc); <br>end; <br>inherited Destroy; <br>end; <br><br>{设置是否允许自动剪贴板监控} <br>procedure TClipMon.SetActive(Value: Boolean); <br>begin <br>if FActive &lt;&gt; Value then FActive := Value; <br>end; <br><br>{取剪贴板格式} <br>function TClipMon.GetFormat: TClipFormat; <br>var <br>I: Integer; <br>begin <br>Result := cfNone; <br>if Clipboard.HasFormat(CF_TEXT) then Result := cfText <br>else if Clipboard.HasFormat(CF_BITMAP) then Result := cfBitmap <br>else if Clipboard.HasFormat(CF_METAFILEPICT) then Result := cfMetaFilePict <br>else if Clipboard.HasFormat(CF_PICTURE) then Result := cfPicture <br>else if Clipboard.HasFormat(CF_COMPONENT) then Result := cfComponent <br>else for I := 0 to Clipboard.FormatCount - 1 do <br>if Clipboard.HasFormat(Clipboard.Formats) then begin <br>Result := cfOther; <br>Break; <br>end; <br>end; <br><br>{伪过程,事实是剪贴板格式是只读的} <br>procedure TClipMon.SetFormat(Value: TClipFormat); <br>begin <br>end; <br><br>{处理来自剪贴板观察器链的消息} <br>procedure TClipMon.NewWndMethod (var msg: TMessage); <br>begin <br>case msg.msg of <br>WM_DRAWCLIPBOARD: <br>begin <br>Loaded; <br>msg.Result := SendMessage(WM_DRAWCLIPBOARD, <br>FNextViewerHandle, 0, 0); <br>end; <br>WM_CHANGECBCHAIN: <br>if THandle(msg.wParam) = FNextViewerHandle then begin <br>FNextViewerHandle := msg.lParam; <br>msg.Result := 0; <br>end else <br>msg.Result := SendMessage(FNextViewerHandle, WM_CHANGECBCHAIN, <br>msg.wParam, msg.lParam); <br>else <br>msg.result := CallWindowProc(OldWndProc, FHandle, msg.msg, <br>msg.WParam, msg.LParam); <br>end; <br>end; <br><br>{部件装载完毕} <br>procedure TClipMon.Loaded; <br>begin <br>if FActive and Assigned(FOnChange) then FOnChange(Self); <br>end; <br><br>end. <br>
 
好多控键本身就带有方法PasteFromClipboard、CutToClipboard、CopyToClipboard<br>如果没有可以使用TClipboard类
 
Memo1.PasteFromClipboard;
 
不uses clipbrd有办法吗?
 
没有窗体能动态建立不显示的edit吗?
 
后退
顶部