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頁を印刷

リスト1
メインフォーム のコード
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.