Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2004年12月31日] [更新 2013年11月04日] Delphi サンプルプログラム集
拙作のコンポーネント類を使用したサンプル
T100_クリップボードの MetaFile を取得して自動表示
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro
以下が必要
拙作のプリンタ設定コンポーネント
拙作の印刷プレビュー制御コンポーネント
T100_Clipboard.zip [848 KB] 2013年11月04日版 (EXE 同梱)



  • 2009年03月06日
  • 終了時にクリップボードをクリアするのを中止.他で使用できなくなるので
  • [印刷] ボタンを廃止.用紙サイズの幅,または長さで描画しているため,キャプチャして画像の縦横サイズによっては,印刷しない部分があるため
  • 2013年11月04日
  • Windows 7 U64(SP1) + Delphi XE Proで動作確認




クリップボードの MetaFile を取得して表示


起動すると,クリップボードにメタファイル形式のデータがあればそれを表示します.また,このプログラム実行中にクリップボードに別のデータが発生するとその内容を表示するようになっています.
印刷プレビューの表示は逐次表示方式とし,ProcName を MetaFileDraw メソッドとしています.
TplPrev コンポーネントの FormIconbar を False にして,継承プレビューフォームの TCoolbar を非表示にしています.代わりに TToolbar を配置して,ここにボタン類を追加しています.

クリップボードのイメージを表示するのに,わざわざ TplPrev を使用する必要はありませんが,このような使い方もできるという例です.



図1
設計時画面
  • FormIconBar を False にして TToolbar 追加
  • 操作用ボタン類を追加
  • フォームには以下を配置
    TplPrev
    TSavePictureDialog
    TImageList を 2 つ
図2
実行開始時の画面
  • クリップボードにまだメタファイルがないので何も表示しない
図3
クリップボードの画像取得
  • ワードの [オートシェイプ] の [基本図形] の一つに色を付けたもの
  • このサンプルプログラムを使用すると,ワードやエクセルの任意の図形だけを保存することが可能

リスト1
サンプルプログラムのコード
継承フォームのユニット.これをメインフォームにしている
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, PLPREVFRM, Menus, ExtCtrls, ComCtrls, Buttons, ToolWin, plPrev,
  ExtDlgs,Clipbrd, ImgList;

type
  TForm1 = class(TplPrevForm)
    plPrev1: TplPrev;
    SavePictureDialog1: TSavePictureDialog;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    ToolButton6: TToolButton;
    ImageList1: TImageList;
    ImageList2: TImageList;
    procedure FormShow(Sender: TObject);
    procedure SaveBtnClick(Sender: TObject);
    procedure plPrev1AfterView(Sender: TObject; Page: Integer);
    procedure ZoomDownBtnClick(Sender: TObject);
    procedure ZoomUpBtnClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private 宣言 }
    MetaClip : TMetaFile;
    procedure MetaFileDraw;
    procedure WmDrawClipboard(var msg: TWmDrawClipboard);
              Message WM_DRAWCLIPBOARD;
  public
    { Public 宣言 }
  end;

var
  Form1 : TForm1;
  hNextClipboardViewerWindow : HWND;

implementation

{$R *.DFM}

//=============================================================================
//  フォームを表示したら,このウィンドウをクリップボードビューワとして登録.
//  初期状態では用紙を表示しないようにするには
//  plPrev1.ImageVisible:=False;
//  を追加する
//=============================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
  //プレビューフォームのOnShowなのでinheritedが必要
  inherited;
  Self.Icon := Application.Icon;

  //操作ボタン類は使用不可
  ToolButton1.Enabled := False;
  ToolButton3.Enabled := False;
  ToolButton4.Enabled := False;
  ToolButton5.Enabled := False;
  ToolButton6.Enabled := False;

  //自分自身のコピーは禁止
  //Items[0]は[現在の頁をコピー]のメニュー
  PopupMenu1.Items[0].Visible := False;

  //クリップボードの内容を記録するメタファイルを作成
  MetaClip := TMetaFile.Create;

  //クリップボードビューアとして登録
  hNextClipboardViewerWindow := SetClipboardViewer(Self.Handle);

  //逐次表示方式で,使用メソッド名はMetaFileDraw
  plPrev1.ProcName := MetaFileDraw;
end;

//=============================================================================
//  クリップボードビューアとしての監視
//  クリップボードにデータが発生した時の処理
//=============================================================================
procedure TForm1.WmDrawClipboard(var msg: TWmDrawClipboard);
begin
  if (Clipboard.HasFormat(CF_METAFILEPICT)) then begin

    //操作ボタン類を使用可能にする
    ToolButton1.Enabled := True;
    ToolButton3.Enabled := True;
    ToolButton4.Enabled := True;
    ToolButton5.Enabled := True;
    ToolButton6.Enabled := True;

    MetaClip.Assign(Clipboard);
    //イメージをnil
    Image1.Picture := nil;
    //表示サイズをクリップボードのサイズに合わせる
    plPrev1.ViewHeight := MetaClip.Height;
    plPrev1.ViewWidth  := MetaClip.Width;

    PageWholeBtnClick(nil);
    plPrev1.Display(1);
    //イメージを表示する
    plPrev1.ImageVisible := True;
  end;
end;

//=============================================================================
//  逐次表示方式の描画ルーチン
//  クリップボードのメタファイル表示
//=============================================================================
procedure TForm1.MetaFileDraw;
begin
  if not(MetaClip.Empty) then begin
    plPrev1.StretchDrawMetaFile(Rect(0, 0, plPrev1.ViewWidth, plPrev1.ViewHeight),
                                MetaClip);
  end;
end;

//=============================================================================
//  用紙の枠線と影の部分は表示しない
//=============================================================================
procedure TForm1.plPrev1AfterView(Sender: TObject; Page: Integer);
begin
  Shape1.Visible := False;
  Shape2.Visible := False;
end;

//=============================================================================
//  フォームを閉じる時の処理
//  クリップボードのチェーンからこのフォームを削除する
//=============================================================================
procedure TForm1.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  FreeAndNil(MetaClip);
  ChangeClipboardChain(Self.Handle, hNextClipboardViewerWindow);

  inherited;
end;

//=============================================================================
//  [保存]ボタン
//  デフォルトの保存先はこのプログラムのフォルダ
//=============================================================================
procedure TForm1.SaveBtnClick(Sender: TObject);
var
  Filename: String;
begin
  SavePictureDialog1.DefaultExt := 'emf';
  SavePictureDialog1.Filter     := 'エンハンス メタファイル|*.emf';
  SavePictureDialog1.InitialDir := ExtractFilePath(Application.ExeName);

  if SavePictureDialog1.Execute then begin
    Update;
    FileName:=SavePictureDialog1.FileName;
    MetaClip.SaveToFile(FileName);
  end;
end;

//=============================================================================
//  [縮小表示]ボタン
//  継承元のZoomDownBtnClickのイベントを利用
//=============================================================================
procedure TForm1.ZoomDownBtnClick(Sender: TObject);
begin
  inherited;

  ToolButton3.Enabled := ZoomDownBtn.Enabled;
  ToolButton4.Enabled := True;
end;

//=============================================================================
//  [拡大表示]ボタン
//  継承元のZoomUpBtnClickのイベントを利用
//=============================================================================
procedure TForm1.ZoomUpBtnClick(Sender: TObject);
begin
  inherited;

  ToolButton3.Enabled := True;
  ToolButton4.Enabled := ZoomUpBtn.Enabled;
end;

end.