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.
|