Delphi Programming / Object Pascal

[掲載 2011年08月06日] [更新 2016年04月19日] 印刷プレビュー制御コンポーネント |
印刷プレビュー制御コンポーネント
MDI アプリケーションでの利用 |
| 動作確認等 |
Windows 7 U64(SP1) + Delphi XE(UP1) Pro で作成 |
印刷プレビュー制御コンポーネントを、MDI (Multiple Document Interface) アプリケーションで利用する際の参考コードです。
MDI アプリケーションの子フォーム (子ウィンドウ) は、Create 等で生成されると同時に表示されてしまいます。したがって、フォームの表示の際に描画コードの実行内容を表示する方式では、OnShow イベント等で印刷プレビュー表示はできません。
そこで、この印刷プレビューコンポーネントでは、継承フォームである子フォームの Show メソッドで描画内容を表示するようしています。この関係で、印刷プレビューコンポーネントは、この継承フォーム上に配置して使用する必要があります。
つまり、MDI アプリケーションにおける子フォームの Show メソッドは、元々そうなのですが、実際には子フォームを表示するためのメソッドではないと言うことになります。 |
 |
図1
MDIアプリのメインフォーム
|
 |
図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.
|