Clipview.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:19k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995 AO ROSNO                   }
  6. {         Copyright (c) 1997 Master-Bank                }
  7. {                                                       }
  8. {*******************************************************}
  9. unit ClipView;
  10. interface
  11. {$I RX.INC}
  12. uses SysUtils, {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  13.   Messages, Classes, Graphics, Controls, Clipbrd, Forms, StdCtrls,
  14.   ExtCtrls, Menus;
  15. type
  16. { TCustomClipboardViewer }
  17.   TClipboardViewFormat = (cvDefault, cvEmpty, cvUnknown, cvText, cvBitmap,
  18.     cvMetafile, cvPalette, cvOemText, cvPicture, cvComponent, cvIcon);
  19.   TCustomClipboardViewer = class(TScrollBox)
  20.   private
  21.     { Private declarations }
  22.     FWndNext: HWnd;
  23.     FChained: Boolean;
  24.     FPaintControl: TComponent;
  25.     FViewFormat: TClipboardViewFormat;
  26.     FOnChange: TNotifyEvent;
  27.     function IsEmptyClipboard: Boolean;
  28.     procedure ForwardMessage(var Message: TMessage);
  29.     procedure WMSize(var Message: TMessage); message WM_SIZE;
  30.     procedure WMDestroyClipboard(var Message: TMessage); message WM_DESTROYCLIPBOARD;
  31.     procedure WMChangeCBChain(var Message: TWMChangeCBChain); message WM_CHANGECBCHAIN;
  32.     procedure WMDrawClipboard(var Message: TMessage); message WM_DRAWCLIPBOARD;
  33.     procedure WMNCDestroy(var Message: TWMNCDestroy); message WM_NCDESTROY;
  34.     procedure SetViewFormat(Value: TClipboardViewFormat);
  35.     function GetClipboardFormatNames(Index: Integer): string;
  36.   protected
  37.     { Protected declarations }
  38.     procedure CreateWnd; override;
  39.     procedure DestroyWindowHandle; override;
  40.     procedure Change; dynamic;
  41.     procedure CreatePaintControl; virtual;
  42.     function GetDrawFormat: TClipboardViewFormat; virtual;
  43.     function ValidFormat(Format: TClipboardViewFormat): Boolean; dynamic;
  44.     property ViewFormat: TClipboardViewFormat read FViewFormat write
  45.       SetViewFormat stored False;
  46.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  47.   public
  48.     { Public declarations }
  49.     constructor Create(AOwner: TComponent); override;
  50.     class function CanDrawFormat(ClipboardFormat: Word): Boolean;
  51.     property ClipboardFormatNames[Index: Integer]: string read GetClipboardFormatNames;
  52.   published
  53.     property Color default clWindow;
  54.     property ParentColor default False;
  55.   end;
  56.   TClipboardViewer = class(TCustomClipboardViewer)
  57.   published
  58. {$IFDEF RX_D4}
  59.     property Anchors;
  60.     property BiDiMode;
  61.     property Constraints;
  62.     property DragKind;
  63.     property ParentBiDiMode;
  64. {$ENDIF}
  65.     property ViewFormat;
  66.     property OnChange;
  67. {$IFDEF RX_D5}
  68.     property OnContextPopup;
  69. {$ENDIF}
  70. {$IFDEF WIN32}
  71.     property OnStartDrag;
  72. {$ENDIF}
  73. {$IFDEF RX_D4}
  74.     property OnEndDock;
  75.     property OnStartDock;
  76. {$ENDIF}
  77.   end;
  78. function ClipboardFormatToView(Value: Word): TClipboardViewFormat;
  79. implementation
  80. uses Grids, ClipIcon, MaxMin, RxTConst, {$IFNDEF WIN32} Str16, {$ENDIF}
  81.   VCLUtils;
  82. { Utility routines }
  83. function ClipboardFormatName(Format: Word): string;
  84. var
  85.   Buffer: array[0..255] of Char;
  86. begin
  87.   SetString(Result, Buffer, GetClipboardFormatName(Format, Buffer, 255));
  88.   if Result = '' then
  89.     case Format of
  90.       CF_BITMAP: Result := 'Bitmap';
  91.       CF_DIB: Result := 'DIB Bitmap';
  92.       CF_DIF: Result := 'DIF';
  93.       CF_METAFILEPICT: Result := 'Metafile Picture';
  94. {$IFDEF WIN32}
  95.       CF_ENHMETAFILE: Result := 'Enchanced Metafile';
  96. {$ENDIF}
  97.       CF_OEMTEXT: Result := 'OEM Text';
  98.       CF_PALETTE: Result := 'Palette';
  99.       CF_PENDATA: Result := 'Pen Data';
  100.       CF_RIFF: Result := 'RIFF File';
  101.       CF_SYLK: Result := 'SYLK';
  102.       CF_TEXT: Result := 'Text';
  103.       CF_TIFF: Result := 'Tag Image';
  104.       CF_WAVE: Result := 'Wave';
  105.     end;
  106. end;
  107. function ViewToClipboardFormat(Value: TClipboardViewFormat): Word;
  108. begin
  109.   case Value of
  110.     cvDefault, cvUnknown, cvEmpty: Result := 0;
  111.     cvText: Result := CF_TEXT;
  112.     cvBitmap: Result := CF_BITMAP;
  113.     cvMetafile: Result := CF_METAFILEPICT;
  114.     cvPalette: Result := CF_PALETTE;
  115.     cvOemText: Result := CF_OEMTEXT;
  116.     cvPicture: Result := CF_PICTURE; { CF_BITMAP, CF_METAFILEPICT }
  117.     cvComponent: Result := CF_COMPONENT; { CF_TEXT }
  118.     cvIcon: Result := CF_ICON; { CF_BITMAP }
  119.     else Result := 0;
  120.   end;
  121. end;
  122. function ClipboardFormatToView(Value: Word): TClipboardViewFormat;
  123. begin
  124.   if Value = CF_TEXT then Result := cvText
  125.   else if Value = CF_BITMAP then Result := cvBitmap
  126.   else if Value = CF_METAFILEPICT then Result := cvMetafile
  127. {$IFDEF WIN32}
  128.   else if Value = CF_ENHMETAFILE then Result := cvMetafile
  129. {$ENDIF}
  130.   else if Value = CF_PALETTE then Result := cvPalette
  131.   else if Value = CF_OEMTEXT then Result := cvOemText
  132.   else if Value = CF_PICTURE then Result := cvPicture { CF_BITMAP, CF_METAFILEPICT }
  133.   else if Value = CF_COMPONENT then Result := cvComponent { CF_TEXT }
  134.   else if Value = CF_ICON then Result := cvIcon { CF_BITMAP }
  135.   else Result := cvDefault;
  136. end;
  137. procedure ComponentToStrings(Instance: TComponent; Text: TStrings);
  138. var
  139.   Mem, Out: TMemoryStream;
  140. begin
  141.   Mem := TMemoryStream.Create;
  142.   try
  143.     Mem.WriteComponent(Instance);
  144.     Mem.Position := 0;
  145.     Out := TMemoryStream.Create;
  146.     try
  147.       ObjectBinaryToText(Mem, Out);
  148.       Out.Position := 0;
  149.       Text.LoadFromStream(Out);
  150.     finally
  151.       Out.Free;
  152.     end;
  153.   finally
  154.     Mem.Free;
  155.   end;
  156. end;
  157. { TPaletteGrid }
  158. const
  159.   NumPaletteEntries = 256;
  160. type
  161.   TPaletteGrid = class(TDrawGrid)
  162.   private
  163.     FPaletteEntries: array[0..NumPaletteEntries - 1] of TPaletteEntry;
  164.     FPalette: HPALETTE;
  165.     FCount: Integer;
  166.     FSizing: Boolean;
  167.     procedure SetPalette(Value: HPALETTE);
  168.     procedure UpdateSize;
  169.     function CellColor(ACol, ARow: Longint): TColor;
  170.     procedure DrawSquare(CellColor: TColor; CellRect: TRect; ShowSelector: Boolean);
  171.   protected
  172.     function GetPalette: HPALETTE; override;
  173.     procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
  174.       AState: TGridDrawState); override;
  175.     function SelectCell(ACol, ARow: Longint): Boolean; override;
  176.     procedure WMSize(var Message: TWMSize); message WM_SIZE;
  177.   public
  178.     constructor Create(AOwner: TComponent); override;
  179.     destructor Destroy; override;
  180.     property Palette: HPALETTE read FPalette write SetPalette;
  181.   end;
  182. function CopyPalette(Palette: HPALETTE): HPALETTE;
  183. var
  184.   PaletteSize: Integer;
  185.   LogSize: Integer;
  186.   LogPalette: PLogPalette;
  187. begin
  188.   Result := 0;
  189.   if Palette = 0 then Exit;
  190.   GetObject(Palette, SizeOf(PaletteSize), @PaletteSize);
  191.   LogSize := SizeOf(TLogPalette) + (PaletteSize - 1) * SizeOf(TPaletteEntry);
  192.   GetMem(LogPalette, LogSize);
  193.   try
  194.     with LogPalette^ do
  195.     begin
  196.       palVersion := $0300;
  197.       palNumEntries := PaletteSize;
  198.       GetPaletteEntries(Palette, 0, PaletteSize, palPalEntry);
  199.     end;
  200.     Result := CreatePalette(LogPalette^);
  201.   finally
  202.     FreeMem(LogPalette, LogSize);
  203.   end;
  204. end;
  205. constructor TPaletteGrid.Create(AOwner: TComponent);
  206. begin
  207.   inherited Create(AOwner);
  208.   DefaultColWidth := 20;
  209.   DefaultRowHeight := 20;
  210.   Options := [];
  211.   GridLineWidth := 0;
  212.   FixedCols := 0;
  213.   FixedRows := 0;
  214.   ColCount := 0;
  215.   RowCount := 0;
  216.   DefaultDrawing := False;
  217.   ScrollBars := ssVertical;
  218. end;
  219. destructor TPaletteGrid.Destroy;
  220. begin
  221.   if FPalette <> 0 then DeleteObject(FPalette);
  222.   inherited Destroy;
  223. end;
  224. procedure TPaletteGrid.UpdateSize;
  225. var
  226.   Rows: Integer;
  227. begin
  228.   if FSizing then Exit;
  229.   FSizing := True;
  230.   try
  231.     ColCount := (ClientWidth - GetSystemMetrics(SM_CXVSCROLL)) div
  232.       DefaultColWidth;
  233.     Rows := FCount div ColCount;
  234.     if FCount mod ColCount > 0 then Inc(Rows);
  235.     RowCount := Max(1, Rows);
  236.     ClientHeight := DefaultRowHeight * RowCount;
  237.   finally
  238.     FSizing := False;
  239.   end;
  240. end;
  241. function TPaletteGrid.GetPalette: HPALETTE;
  242. begin
  243.   if FPalette <> 0 then Result := FPalette
  244.   else Result := inherited GetPalette;
  245. end;
  246. procedure TPaletteGrid.SetPalette(Value: HPALETTE);
  247. var
  248.   I: Integer;
  249.   ParentForm: TCustomForm;
  250. begin
  251.   if FPalette <> 0 then DeleteObject(FPalette);
  252.   FPalette := CopyPalette(Value);
  253.   FCount := Min(PaletteEntries(FPalette), NumPaletteEntries);
  254.   GetPaletteEntries(FPalette, 0, FCount, FPaletteEntries);
  255.   for I := FCount to NumPaletteEntries - 1 do
  256.     FillChar(FPaletteEntries[I], SizeOf(TPaletteEntry), $80);
  257.   UpdateSize;
  258.   if Visible and (not (csLoading in ComponentState)) then begin
  259.     ParentForm := GetParentForm(Self);
  260.     if Assigned(ParentForm) and ParentForm.Active and
  261.       Parentform.HandleAllocated then
  262.       PostMessage(ParentForm.Handle, WM_QUERYNEWPALETTE, 0, 0);
  263.   end;
  264. end;
  265. function TPaletteGrid.CellColor(ACol, ARow: Longint): TColor;
  266. var
  267.   PalIndex: Integer;
  268. begin
  269.   PalIndex := ACol + (ARow * ColCount);
  270.   if PalIndex <= FCount - 1 then
  271.     with FPaletteEntries[PalIndex] do
  272.       Result := TColor(RGB(peRed, peGreen, peBlue))
  273.   else Result := clNone;
  274. end;
  275. procedure TPaletteGrid.DrawSquare(CellColor: TColor; CellRect: TRect;
  276.   ShowSelector: Boolean);
  277. var
  278.   SavePal: HPalette;
  279. begin
  280.   Canvas.Pen.Color := clBtnFace;
  281.   with CellRect do Canvas.Rectangle(Left, Top, Right, Bottom);
  282.   InflateRect(CellRect, -1, -1);
  283.   Frame3D(Canvas, CellRect, clBtnShadow, clBtnHighlight, 2);
  284.   SavePal := 0;
  285.   if FPalette <> 0 then begin
  286.     SavePal := SelectPalette(Canvas.Handle, FPalette, False);
  287.     RealizePalette(Canvas.Handle);
  288.   end;
  289.   try
  290.     Canvas.Brush.Color := CellColor;
  291.     Canvas.Pen.Color := CellColor;
  292.     with CellRect do Canvas.Rectangle(Left, Top, Right, Bottom);
  293.   finally
  294.     if FPalette <> 0 then SelectPalette(Canvas.Handle, SavePal, True);
  295.   end;
  296.   if ShowSelector then begin
  297.     Canvas.Brush.Color := Self.Color;
  298.     Canvas.Pen.Color := Self.Color;
  299.     InflateRect(CellRect, -1, -1);
  300.     Canvas.DrawFocusRect(CellRect);
  301.   end;
  302. end;
  303. function TPaletteGrid.SelectCell(ACol, ARow: Longint): Boolean;
  304. begin
  305.   Result := ((ACol = 0) and (ARow = 0)) or (CellColor(ACol, ARow) <> clNone);
  306. end;
  307. procedure TPaletteGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
  308.   AState: TGridDrawState);
  309. var
  310.   Color: TColor;
  311. begin
  312.   Color := CellColor(ACol, ARow);
  313.   if Color <> clNone then
  314.     DrawSquare(PaletteColor(Color), ARect, gdFocused in AState)
  315.   else begin
  316.     Canvas.Brush.Color := Self.Color;
  317.     Canvas.FillRect(ARect);
  318.   end;
  319. end;
  320. procedure TPaletteGrid.WMSize(var Message: TWMSize);
  321. begin
  322.   inherited;
  323.   UpdateSize;
  324. end;
  325. { TCustomClipboardViewer }
  326. constructor TCustomClipboardViewer.Create(AOwner: TComponent);
  327. begin
  328.   inherited Create(AOwner);
  329.   ControlState := ControlState + [csCreating];
  330. {$IFNDEF WIN32}
  331.   ControlStyle := ControlStyle + [csFramed];
  332. {$ENDIF}
  333.   FWndNext := 0;
  334.   FPaintControl := nil;
  335.   FViewFormat := cvDefault;
  336.   ParentColor := False;
  337.   Color := clWindow;
  338.   ControlState := ControlState - [csCreating];
  339. end;
  340. procedure TCustomClipboardViewer.ForwardMessage(var Message: TMessage);
  341. begin
  342.   if FWndNext <> 0 then
  343.     with Message do SendMessage(FWndNext, Msg, WParam, LParam);
  344. end;
  345. procedure TCustomClipboardViewer.CreateWnd;
  346. begin
  347.   inherited CreateWnd;
  348.   if Handle <> 0 then begin
  349.     FWndNext := SetClipboardViewer(Handle);
  350.     FChained := True;
  351.   end;
  352. end;
  353. procedure TCustomClipboardViewer.DestroyWindowHandle;
  354. begin
  355.   if FChained then begin
  356.     ChangeClipboardChain(Handle, FWndNext);
  357.     FChained := False;
  358.   end;
  359.   FWndNext := 0;
  360.   inherited DestroyWindowHandle;
  361. end;
  362. procedure TCustomClipboardViewer.CreatePaintControl;
  363. var
  364.   Icon: TIcon;
  365.   Format: TClipboardViewFormat;
  366.   Instance: TComponent;
  367. begin
  368.   if csDesigning in ComponentState then Exit;
  369.   FPaintControl.Free;
  370.   FPaintControl := nil;
  371.   if IsEmptyClipboard then Exit;
  372.   Format := GetDrawFormat;
  373.   if not ValidFormat(Format) then Format := cvUnknown;
  374.   case Format of
  375.     cvText, cvOemText, cvUnknown, cvDefault, cvEmpty:
  376.       begin
  377.         FPaintControl := TMemo.Create(Self);
  378.         with TMemo(FPaintControl) do begin
  379.           BorderStyle := bsNone;
  380.           Parent := Self;
  381.           Left := 0;
  382.           Top := 0;
  383.           ScrollBars := ssBoth;
  384.           Align := alClient;
  385.           if Format = cvOemText then begin
  386.             ParentFont := False;
  387.             Font.Name := 'Terminal';
  388.           end;
  389.           Visible := True;
  390.           if Clipboard.HasFormat(CF_TEXT) then PasteFromClipboard
  391.           else if (Format = cvText) and Clipboard.HasFormat(CF_COMPONENT) then
  392.           begin
  393.             Instance := Clipboard.GetComponent(Self, Self);
  394.             try
  395.               ComponentToStrings(Instance, Lines);
  396.             finally
  397.               Instance.Free;
  398.             end;
  399.           end
  400.           else if IsEmptyClipboard then Text := LoadStr(SClipbrdEmpty)
  401.           else Text := LoadStr(SClipbrdUnknown);
  402.           ReadOnly := True;
  403.         end;
  404.       end;
  405.     cvPicture, cvMetafile, cvBitmap, cvIcon:
  406.       begin
  407.         FPaintControl := TImage.Create(Self);
  408.         with TImage(FPaintControl) do begin
  409.           Parent := Self;
  410.           AutoSize := True;
  411.           Left := 0;
  412.           Top := 0;
  413.           Visible := True;
  414.           if Format = cvIcon then begin
  415.             if Clipboard.HasFormat(CF_ICON) then begin
  416.               Icon := CreateIconFromClipboard;
  417.               try
  418.                 Picture.Icon := Icon;
  419.               finally
  420.                 Icon.Free;
  421.               end;
  422.             end;
  423.           end
  424.           else if ((Format = cvBitmap) and Clipboard.HasFormat(CF_BITMAP))
  425.             or ((Format = cvMetafile) and (Clipboard.HasFormat(CF_METAFILEPICT))
  426.             {$IFDEF WIN32} or Clipboard.HasFormat(CF_ENHMETAFILE) {$ENDIF WIN32})
  427.             or ((Format = cvPicture) and Clipboard.HasFormat(CF_PICTURE)) then
  428.           begin
  429.             Picture.Assign(Clipboard);
  430.           end;
  431.         end;
  432.         CenterControl(TImage(FPaintControl));
  433.       end;
  434.     cvComponent:
  435.       begin
  436.         Instance := Clipboard.GetComponent(Self, Self);
  437.         FPaintControl := Instance;
  438.         if FPaintControl is TControl then
  439.         begin
  440.           with TControl(FPaintControl) do begin
  441.             Left := 1;
  442.             Top := 1;
  443.             Parent := Self;
  444.           end;
  445.           CenterControl(TControl(FPaintControl));
  446.         end
  447.         else begin
  448.           FPaintControl := TMemo.Create(Self);
  449.           try
  450.             with TMemo(FPaintControl) do begin
  451.               BorderStyle := bsNone;
  452.               Parent := Self;
  453.               Left := 0;
  454.               Top := 0;
  455.               ScrollBars := ssBoth;
  456.               Align := alClient;
  457.               ReadOnly := True;
  458.               ComponentToStrings(Instance, Lines);
  459.               Visible := True;
  460.             end;
  461.           finally
  462.             Instance.Free;
  463.           end;
  464.         end;
  465.       end;
  466.     cvPalette:
  467.       begin
  468.         FPaintControl := TPaletteGrid.Create(Self);
  469.         with TPaletteGrid(FPaintControl) do
  470.         try
  471.           BorderStyle := bsNone;
  472.           Parent := Self;
  473.           Ctl3D := False;
  474.           Align := alClient;
  475.           Clipboard.Open;
  476.           try
  477.             Palette := GetClipboardData(CF_PALETTE);
  478.           finally
  479.             Clipboard.Close;
  480.           end;
  481.         except
  482.           FPaintControl.Free;
  483.           raise;
  484.         end;
  485.       end;
  486.   end;
  487. end;
  488. function TCustomClipboardViewer.GetClipboardFormatNames(Index: Integer): string;
  489. begin
  490.   Result := '';
  491.   if Index < Clipboard.FormatCount then
  492.     Result := ClipboardFormatName(Clipboard.Formats[Index]);
  493. end;
  494. procedure TCustomClipboardViewer.Change;
  495. begin
  496.   if Assigned(FOnChange) then FOnChange(Self);
  497. end;
  498. procedure TCustomClipboardViewer.WMSize(var Message: TMessage);
  499. begin
  500.   inherited;
  501.   if (FPaintControl <> nil) and (FPaintControl is TControl) then
  502.     CenterControl(TControl(FPaintControl));
  503. end;
  504. procedure TCustomClipboardViewer.WMChangeCBChain(var Message: TWMChangeCBChain);
  505. begin
  506.   if Message.Remove = FWndNext then FWndNext := Message.Next
  507.   else ForwardMessage(TMessage(Message));
  508.   inherited;
  509. end;
  510. procedure TCustomClipboardViewer.WMNCDestroy(var Message: TWMNCDestroy);
  511. begin
  512.   if FChained then begin
  513.     ChangeClipboardChain(Handle, FWndNext);
  514.     FChained := False;
  515.     FWndNext := 0;
  516.   end;
  517.   inherited;
  518. end;
  519. procedure TCustomClipboardViewer.WMDrawClipboard(var Message: TMessage);
  520. var
  521.   Format: Word;
  522. begin
  523.   ForwardMessage(Message);
  524.   Format := ViewToClipboardFormat(ViewFormat);
  525.   if IsEmptyClipboard then FViewFormat := cvEmpty
  526.   else if not Clipboard.HasFormat(Format) then FViewFormat := cvDefault;
  527.   Change;
  528.   DisableAlign;
  529.   try
  530.     CreatePaintControl;
  531.   finally
  532.     EnableAlign;
  533.   end;
  534.   inherited;
  535. end;
  536. procedure TCustomClipboardViewer.WMDestroyClipboard(var Message: TMessage);
  537. begin
  538.   FViewFormat := cvEmpty;
  539.   Change;
  540.   CreatePaintControl;
  541. end;
  542. function TCustomClipboardViewer.IsEmptyClipboard: Boolean;
  543. begin
  544.   Result := (Clipboard.FormatCount = 0);
  545. end;
  546. procedure TCustomClipboardViewer.SetViewFormat(Value: TClipboardViewFormat);
  547. var
  548.   Format: Word;
  549. begin
  550.   if Value <> ViewFormat then begin
  551.     Format := ViewToClipboardFormat(Value);
  552.     if (Clipboard.HasFormat(Format) and ValidFormat(Value)) then
  553.       FViewFormat := Value
  554.     else FViewFormat := cvDefault;
  555.     CreatePaintControl;
  556.   end;
  557. end;
  558. function TCustomClipboardViewer.GetDrawFormat: TClipboardViewFormat;
  559.   function DefaultFormat: TClipboardViewFormat;
  560.   begin
  561.     if Clipboard.HasFormat(CF_TEXT) then Result := cvText
  562.     else if Clipboard.HasFormat(CF_OEMTEXT) then Result := cvOemText
  563.     else if Clipboard.HasFormat(CF_BITMAP) then Result := cvBitmap
  564.     else if (Clipboard.HasFormat(CF_METAFILEPICT))
  565. {$IFDEF WIN32}
  566.       or (Clipboard.HasFormat(CF_ENHMETAFILE))
  567. {$ENDIF}
  568.       then Result := cvMetafile
  569.     else if Clipboard.HasFormat(CF_ICON) then Result := cvIcon
  570.     else if Clipboard.HasFormat(CF_PICTURE) then Result := cvPicture
  571.     else if Clipboard.HasFormat(CF_COMPONENT) then Result := cvComponent
  572.     else if Clipboard.HasFormat(CF_PALETTE) then Result := cvPalette
  573.     else Result := cvUnknown;
  574.   end;
  575. begin
  576.   if IsEmptyClipboard then Result := cvEmpty
  577.   else begin
  578.     Result := ViewFormat;
  579.     if Result = cvDefault then Result := DefaultFormat;
  580.   end;
  581. end;
  582. class function TCustomClipboardViewer.CanDrawFormat(ClipboardFormat: Word): Boolean;
  583. begin
  584.   Result := ClipboardFormatToView(ClipboardFormat) <> cvUnknown;
  585. end;
  586. function TCustomClipboardViewer.ValidFormat(Format: TClipboardViewFormat): Boolean;
  587. begin
  588.   Result := (Format in [cvDefault, cvEmpty, cvUnknown]);
  589.   if not Result then begin
  590.     if Clipboard.HasFormat(ViewToClipboardFormat(Format)) then
  591.       Result := True;
  592.   end;
  593. end;
  594. end.