Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2011年08月06日] [更新 2016年04月19日] 印刷プレビュー制御コンポーネント
   
印刷プレビュー制御コンポーネント
MDI アプリケーションでの利用
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro で作成







MDI アプリケーションでの利用


印刷プレビュー制御コンポーネントを,MDI (Multiple Document Interface) アプリケーションで利用する際の参考コードです.
MDI アプリケーションの子フォーム (子ウィンドウ) は,Create 等で生成されると同時に表示されてしまいます.したがって,フォームの表示の際に描画コードの実行内容を表示する方式では,OnShow イベント等で印刷プレビュー表示はできません.
そこで,この印刷プレビューコンポーネントでは,継承フォームである子フォームの Show メソッドで描画内容を表示するようしています.この関係で,印刷プレビューコンポーネントは,この継承フォーム上に配置して使用する必要があります.
つまり,MDI アプリケーションにおける子フォームの Show メソッドは,元々そうなのですが,実際には子フォームを表示するためのメソッドではないと言うことになります.


図1
MDIアプリのメインフォーム
  • FormStyle は fsMDIForm
図2
MDIアプリの子フォーム
  • TplPrevfrm を継承して作成
  • FormStyle は fsMDIChild
  • 印刷プレビューコンポ,TplPrev を追加配置




子フォーム ( 子ウィンドウ ) をメニュー等から実行時生成


MDI アプリケーションのメニューから子フォームを生成して表示する場合の参考コードです.ここでは代りにボタンクリックで生成して表示するようにしています.
子フォームは,自動生成の対象から外し,[使用可能なフォーム] にしておきます.


図3
MID アプリを起動
  • メインフォームが表示される
図4
子フォームを生成して表示
  • ボタンをクリックすると子フォームを生成して印刷プレビュー表示

リスト1
子フォーム (子ウィンドウ) をメニュー等から実行時生成
ここではメニューの代りにボタン
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses
  Printers,
  Unit2;

{$R *.dfm}

//=============================================================================
//  MDIアプリケーションでの利用
//  子フォーム(子ウィンドウ)をメニュー等から実行時生成する場合を想定
//  (ここではボタンで代用)
//
//  本フォームのFormStyleはfsMDIForm
//  MDIアプリの子ウィンドウはTplPrevFormの継承フォームで以下の設定
//    FormStyleはfsMDIChild
//    使用可能なフォーム
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  //子ウィンドウ(子フォーム)を生成
  plPrevForm2 := TplPrevForm2.Create(Application);

  //プリンタの設定
  //poLandscape等の定数名の使用にはusesにPrintersが必要
  plPrevForm2.plPrev1.plSetPrinter.PrinterNumber := DMPAPER_A4;
  plPrevForm2.plPrev1.plSetPrinter.Orientation   := poLandscape;

  plPrevForm2.plPrev1.BeginDoc;
  try
    plPrevForm2.plPrev1.FontSize(72);
    plPrevForm2.plPrev1.TextRectCC(200, 2700, 500, 1400, '神様,仏様,稲尾様!!');
  finally
    plPrevForm2.plPrev1.EndDoc;
  end;

  //MDIアプリの場合,Showメソッドは子ウィンドウの表示ではなく
  //描画コードの実行結果の表示となる
  plPrevForm2.Show;
end;

end.


子フォーム (子ウィンドウ) のコード例
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, plPrevfrm, plPrev, Menus, Buttons, ToolWin, ComCtrls, ExtCtrls;

type
  TplPrevForm2 = class(TplPrevForm)
    plPrev1: TplPrev;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  plPrevForm2: TplPrevForm2;

implementation

{$R *.dfm}

procedure TplPrevForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  Action := caFree;
end;

end.




子フォーム ( 子ウィンドウ ) を自動生成


子フォームを [自動生成] のままにして表示する場合の参考コードです.メインフォームの OnShow イベント内に描画コードを書きます.


図5
MDIアプリを実行
  • 自動生成の子フォームが表示され,印刷プレビュー表示

リスト2
子フォーム (子ウィンドウ) を自動生成して印刷プレビュー
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses
  Printers,
  Unit2;

{$R *.dfm}

//=============================================================================
//  MDIアプリケーションでの利用
//  メインフォーム表示後に,子ウィンドウを表示する場合
//  メインフォームのOnShowで,実行時に表示する印刷描画コードを実行
//
//  本フォームのFormStyleはfsMDIForm
//  MDIアプリの子ウィンドウはTplPrevFormの継承フォームで以下の設定
//    FormStyleはfsMDIChild
//    自動生成フォーム
//=============================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
  //プリンタの設定
  //poLandscape等の定数名の使用にはusesにPrintersが必要
  plPrevForm2.plPrev1.plSetPrinter.PrinterNumber := DMPAPER_A4;
  plPrevForm2.plPrev1.plSetPrinter.Orientation   := poLandscape;

  plPrevForm2.plPrev1.BeginDoc;
  try
    plPrevForm2.plPrev1.FontSize(72);
    plPrevForm2.plPrev1.TextRectCC(200, 2700, 500, 1400, '神様,仏様,稲尾様!!');
  finally
    plPrevForm2.plPrev1.EndDoc;
  end;

  //MDIアプリの場合,Showメソッドは子ウィンドウの表示ではなく
  //描画コードの実行結果の表示となる
  plPrevForm2.Show;
end;

end.




子フォーム ( 子ウィンドウ ) を自動生成してメニュー等から描画コード実行


子フォームを [自動生成] のままにして表示しますが,表示直後は何も描画したくない場合の参考コードです.メインフォームのメニュー等から描画内容を表示します.ここでは,ボタンクリックで代用しています.


図6
MDIアプリを起動
  • 自動生成の子フォームを表示
図7
印刷プレビュー表示
  • ボタンをクリックすると,印刷プレビュー開始

リスト3
子フォーム (子ウィンドウ) を自動生成してメニュー等から描画コード実行する場合
ここではメニュー代りにボタンを使用
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses 
  Printers, 
  Unit2;

{$R *.dfm}

//=============================================================================
//  MDIアプリケーションでの利用
//  子フォーム(子ウィンドウ)をメニュー等から実行時生成する場合を想定
//  (ここではボタンで代用)
//
//  本フォームのFormStyleはfsMDIForm
//  MDIアプリの子ウィンドウはTplPrevFormの継承フォームで以下の設定
//    FormStyleはfsMDIChild
//    自動生成フォーム
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  //プリンタの設定
  //poLandscape等の定数名の使用にはusesにPrintersが必要
  plPrevForm2.plPrev1.plSetPrinter.PrinterNumber := DMPAPER_A4;
  plPrevForm2.plPrev1.plSetPrinter.Orientation   := poLandscape;

  plPrevForm2.plPrev1.BeginDoc;
  try
    plPrevForm2.plPrev1.FontSize(72);
    plPrevForm2.plPrev1.TextRectCC(200, 2700, 500, 1400, '神様,仏様,稲尾様!!');
  finally
    plPrevForm2.plPrev1.EndDoc;
  end;

  //MDIアプリの場合,Showメソッドは子ウィンドウの表示ではなく
  //描画コードの実行結果の表示となる
  plPrevForm2.Show;
end;

end.