Delphi Programming / Object Pascal
[掲載 2000年12月12日] [更新 2016年04月19日] 印刷プレビュー制御コンポーネント |
印刷プレビュー制御コンポーネント
基本的なプロパティ |
動作確認等 |
図は Windows 7 U64(SP1) + Delphi XE(UP1) Pro で作成 |
凡例 |
■ published
□ public
▲ ReadOnly |
□ Canvas |
TCanvas |
描画用のキャンバスで,実体は TMetaFileCanvas |
■ plSetPrinter |
TplSetPrinter |
印刷に使用するプリンタとそのプロパティを設定
プリンタとプロパティはコードでも設定可能 |
■ FormName |
String |
プレビュー用のフォーム名
省略した場合は自動生成して,終了時に自動解放する
それ以外は,利用者が生成して解放,破棄する
専用のプレビューフォーム以外も指定できる,プレビューの制御コードは利用者が作成することになる |
□ Form |
TplPrevForm |
FormName プロパティの代わりに,実行時にこのプロパティでプレビューフォームを指定できる
このオブジェクトの生成と解放は,利用者が行う |
□ ProcName |
TPrevProc |
逐次表示方式で,実際に描画コードを記述するメソッド名を指定
メソッドポインタ型なので,クラス内でのプロシージャーのみ指定可能.引数を持つことはできない |
▲ PageNumber |
Integer |
頁番号 |
■ PageCount |
Integer |
総頁数
先読み方式では描画終了後に設定される
予め取得することはできない
先読み方式で総頁数を印刷する方法は,OnBeforeView イベントの説明を参考のこと
逐次表示方式では,予め設定しておくこと |
■ Title |
String |
印刷ドキュメントの名前
プレビューフォームのキャプションとなる |
■ Cursor |
TCurso |
表示処理中に使用するカーソル形状の指定 |
■ ZoomType |
TZmType |
用紙の表示タイプで以下の 3 種類
起動時に ztOther を指定しても,強制的に ztWholePage に変更されてしまうので注意
ztWholePage : 頁全体を表示
ztPageWidth : 頁幅を基準とした表示
ztOther : その他の表示 |
□ ImageVisible |
Boolean |
False にすると用紙のイメージを表示しない
デフォルトは True |
■ ImageDrag |
Boolean |
False にすると用紙イメージのマウス移動はしない
デフォルトは True |
■ ImageShade |
Boolean |
False にすると用紙の影部分を表示しない
デフォルトは True |
FormName プロパティに,専用のプレビューフォーム以外を指定すると,ShowModal メソッドでこのフォームを表示します.GetMetaImage メソッドで,指定頁のメタファイルを取得して表示することができます. |
[備考]
本コンポーネントは,FormName プロパティで表示したフォームの解放処理は行いません.
FormName プロパティで指定したフォームを,自動生成ではなく,実行時に生成して利用する場合は解放処理が必要です.
このことは,印刷プレビュー制御コンポーネントの問題ではなく,Delphi におけるコーディングの一般的な問題です. |
|
図1
プログラム例
- 新規作成の Form2 に TImage と TButton を配置
- 本コンポの FormName プロパティにこの Form2 を指定
- テスト用のコードを下のコードとする
- [F9] で実行
- [印刷] ボタンをクリックすると4, 5頁を印刷
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, plPrev;
type
TForm1 = class(TForm)
Button1: TButton;
plPrev1: TplPrev;
procedure Button1Click(Sender: TObject);
procedure plPrev1BeforeView(Sender: TObject; Page: Integer);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
Printers,
Unit2;
{$R *.DFM}
//=============================================================================
// 専用のプレビューフォーム以外の使用
//
// 10分頁を作成して表示
// ここではテストなのでこのコードを作成する段階で頁数はわかっている
// 実際のアプリでは不明なこともある
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LPageStr : string;
i : Integer;
begin
//プレビューするフォームを指定
//このサンプルの場合はusesにunit2(Form2のユニット)を追加している
plPrev1.Form := Form2;
//プリンタの設定
//poLandscape等の定数名の使用にはusesにPrintersが必要
plPrev1.plSetPrinter.PrinterNumber := DMPAPER_A4;
plPrev1.plSetPrinter.Orientation := poPortrait;
plPrev1.BeginDoc;
try
//文字のサイズ
plPrev1.FontSize(40);
//9回改頁を繰り返す
i:=1;
while True do begin
//頁番号の文字列を作成
LPageStr := IntToStr(plPrev1.PageNumber) + ' 頁目';
//文字列を描画
plPrev1.TextOut(450, 300, LPageStr);
i := i + 1;
if i > 10 then break;
//改頁
plPrev1.NewPage;
end;
finally
plPrev1.EndDoc;
end;
//プレビュー開始
plPrev1.ShowModal;
end;
//=============================================================================
// TplPrevのOnBeforeViewイベント処理
// OnBeforeViewイベントではCanvasに描画できる
// このコードは印刷時にも実行される
// (OnBeforeViewイベントは逐次表示方式では無効)
//=============================================================================
procedure TForm1.plPrev1BeforeView(Sender: TObject; Page: Integer);
var
LPageStr : string;
begin
//文字のサイズ
plPrev1.FontSize(100);
//頁番号の文字列を作成
LPageStr := IntToStr(Page) + '/' + IntToStr(plPrev1.PageCount);
//X=105.0mm,Y=270.0mmに位置に文字列を描画
plPrev1.TextOutCC(1050, 2600, LPageStr);
end;
end.
リスト2
プレビューフォームのコード
このフォーム上の Iamage1 にプレビュー画像を表示 |
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm2 = class(TForm)
Image1: TImage;
Button1: TButton;
Button2: TButton;
Button3: TButton;
PrintDialog1: TPrintDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private 宣言 }
FPrevPage : Integer;
public
{ Public 宣言 }
end;
var
Form2: TForm2;
implementation
uses
plPrev,
Unit1;
{$R *.DFM}
//=============================================================================
// FormNameで指定したこのForm2のOnActivateイベント
// このForm2上のImage1に2頁目のメタファイルを表示
//=============================================================================
procedure TForm2.FormActivate(Sender: TObject);
begin
FPrevPage := 2;
Image1.Height := Trunc(Image1.Width * Form1.plPrev1.PaperRatio);
Image1.Canvas.StretchDraw(Image1.ClientRect,
Form1.plPrev1.GetMetaImage(FPrevPage));
OnActivate := nil;
end;
//=============================================================================
// [印刷]ボタンをクリックすると4,5頁を印刷
//=============================================================================
procedure TForm2.Button1Click(Sender: TObject);
begin
if PrintDialog1.Execute then begin
Form1.plPrev1.PrintFromPage := 4;
Form1.plPrev1.PrintToPage := 5;
Form1.plPrev1.Print;
end;
end;
//=============================================================================
// 前の頁を表示
//=============================================================================
procedure TForm2.Button2Click(Sender: TObject);
begin
if FPrevPage > 1 then begin
Dec(FPrevPage);
Image1.Canvas.StretchDraw(Image1.ClientRect,
Form1.plPrev1.GetMetaImage(FPrevPage));
end;
end;
//=============================================================================
// 次頁を表示
//=============================================================================
procedure TForm2.Button3Click(Sender: TObject);
begin
if FPrevPage < Form1.plPrev1.PageCount then begin
Inc(FPrevPage);
Image1.Canvas.StretchDraw(Image1.ClientRect,
Form1.plPrev1.GetMetaImage(FPrevPage));
end;
end;
end.
|