Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2004年12月31日] [更新 2013年11月05日] Delphi サンプルプログラム集
   
拙作のコンポーネント類を使用したサンプル
T120_TFormPanel
利用の印刷プレビュー  (2)
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro
以下のコンポーネント類が必要 (TplXXX は拙作のコンポーネント)
TplSetPrinter, TplPrev, TplQueryPrev, TplTackPrev, TFormPanel
T120_FormPanel2.zip [1,051 KB] 2013年11月05日版 (EXE 同梱)



  • 2013年11月05日
  • Windows 7 U64(SP1) + Delphi XE Proで動作確認




TFormPanel で印刷プレビュー ( 他フォーム上でプレビュー切換え )


印刷プレビュー制御フォームを単独ではなく,別の,ここでは,アプリケーションのメインフォームに表示するサンプルです.印刷プレビュー制御コンポーネント,クエリ印刷コンポーネント,タックシール印刷コンポーネントを使用して,印刷プレビュー制御フォームにその描画結果を表示します.

フォーム上に配置した TFormPanel コンポーネントに印刷プレビューフォームを表示します.
TFormPanel コンポーネントは,Osamu's Square の竹内修さんのサイトにあります.
印刷プレビュー制御フォームは,各プレビューコンポーネントを使用する度に,一度破棄し,再度生成して使用しています.また,クエリ印刷コンポとタックシール印刷コンポは,各々の派生クラスを定義して,protected 部の Execute メソッドを実行しています.


図1
設計時画面
  • フォーム上に以下のコンポ類を配置
  • 印刷プレビュー制御コンポ TplPrev
  • クエリー印刷と TTable
  • タックシール印刷と TQuery
図2
1 番上のボタンをクリック
図3
2 番目のボタンをクリック
  • クエリー印刷コンポを実行
図4
3 番目のボタンをクリック
  • タックシール印刷コンポを実行
  • 実行内容はタックシール印刷コンポ添付の Hagaki と同じ

リスト1
印刷プレビュー制御フォームを,メインフォームに表示
印刷プレビュー制御コンポ,クエリ印刷コンポ, タックシール印刷コンポを使用
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls, FormPnl, plPrev, Grids,
  DBGrids, Db, DBTables, plQueryPrev, plTackPrev;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    FormPanel1: TFormPanel;
    plPrev1: TplPrev;
    plQueryPrev1: TplQueryPrev;
    plTackPrev1: TplTackPrev;
    Panel0: TPanel;
    SpeedButton01: TSpeedButton;
    SpeedButton02: TSpeedButton;
    SpeedButton03: TSpeedButton;
    SpeedButton10: TSpeedButton;
    Table1: TTable;
    Query1: TQuery;
    Query1CustNo: TFloatField;
    Query1Company: TStringField;
    Query1Zip: TStringField;
    Query1Addr1: TStringField;
    Query1Phone: TStringField;
    procedure SpeedButton10Click(Sender: TObject);
    procedure SpeedButton01Click(Sender: TObject);
    procedure SpeedButton02Click(Sender: TObject);
    procedure SpeedButton03Click(Sender: TObject);
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    procedure plTackPrev1FormClose(Sender: TObject;
      var Action: TCloseAction);
    procedure plTackPrev1PrinterSetupDialog(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private 宣言 }
    procedure Test1(PV:TplPrev);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses plPrevfrm;

//各コンポのProtectedにアクセスするためのクラス定義
type
  TPVQuery = class(TplQueryPrev);
  TPVTack  = class(TplTackPrev);
var
   PVForm : TplPrevForm;

{$R *.DFM}

//=============================================================================
//  ダミーのプレビューフォームを表示して,いかにもプレビュー画面であることを印
//  象づける
//=============================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
  PVForm := TplPrevForm.Create(Self);
  PVForm.CloseBtn.Visible := False;
  PVForm.plPrev := plPrev1;

  //以下の2行を削除すれば用紙を表示しない
  plPrev1.BeginDoc;
  plPrev1.EndDoc;

  FormPanel1.Form := PVForm;
end;

//=============================================================================
//  描画位置指定の文字列描画例
//  (先読み方式)
//  既にプレビューフォームがあれば破棄し,新たに生成する.
//  そのフォームにどの印刷関係コンポを使用するか指定して実行する
//
//  Preveiwメソッドでなく,FormPanelのFormプロパティにプレビューフォームを設定
//  Button2,Button3のクリックイベントも同じ手順
//=============================================================================
procedure TForm1.SpeedButton01Click(Sender: TObject);
begin
  //表示終了までボタン類は操作させない
  Panel0.Enabled := False;
  LockWindowUpdate(Handle);
  if Assigned(FormPanel1.Form) then begin
    FormPanel1.Form := nil;
    FreeAndNil(PVForm);
  end;
  Update;
  PVForm        := TplPrevForm.Create(Self);
  PVForm.plPrev := plPrev1;

  Test1(plPrev1);
  FormPanel1.Form := PVForm;
  Panel0.Enabled  := True;
  LockWindowUpdate(0);
end;

//=============================================================================
//  TplQueryPrevを使用してデータを表示
//  Delphi附属のDBDEMOSのcustomer.dbのデータ
//  Tableコンポーネントを使用
//
//  印刷項目は全てTable1で設定済み
//=============================================================================
procedure TForm1.SpeedButton02Click(Sender: TObject);
begin
  Panel0.Enabled := False;
  LockWindowUpdate(Handle);
  if Assigned(FormPanel1.Form) then begin
    FormPanel1.Form := nil;
    FreeAndNil(PVForm);
  end;
  Update;

  PVForm := TplPrevForm.Create(Self);
  PVForm.plPrev := plQueryPrev1;

  //TplQueryPrevのprotected部のExecuteを実行
  TPVQuery(plQueryPrev1).Execute;
  FormPanel1.Form := PVForm;
  Panel0.Enabled  := True;
  LockWindowUpdate(0);
end;

//=============================================================================
//  TplTackPrevを使用してデータを表示
//  Delphi附属のDBDEMOSのcustomer.dbのデータ
//  内容はTplTackPrevのテストプログラムのHagakiと同じだが,プリンタの設定値の保
//  存と読出しコードを追加
//
//  Query1のDatabaseNameは'DBDEMOS'で'SQL文は以下の通り
//  select  CustNo,Company,Zip,Addr1,Phone from customer
//  印刷項目は全てplTackPrev1のColumnsプロパティで設定済み
//=============================================================================
procedure TForm1.SpeedButton03Click(Sender: TObject);
var
  AFileName : String;
begin
  Panel0.Enabled := False;
  LockWindowUpdate(Handle);
  if Assigned(FormPanel1.Form) then begin
    FormPanel1.Form := nil;
    FreeAndNil(PVForm);
  end;
  Update;

  PVForm:=TplPrevForm.Create(Self);
  //保存してあるプリンタの設定があれば読出す
  AFileName:=ExtractFilePath(Application.ExeName) + 'plTackPrev1.plv';
  plTackPrev1.plSetPrinter.LoadFromFile(AFileName);

  PVForm.plPrev := plTackPrev1;

  //TplTackPrevのprotected部のExecuteを実行
  TPVTack(plTackPrev1).Execute;
  FormPanel1.Form := PVForm;
  Panel0.Enabled  := True;
  LockWindowUpdate(0);
end;

//=============================================================================
//  [終了]ボタン押下時の処理
//=============================================================================
procedure TForm1.SpeedButton10Click(Sender: TObject);
begin
  Close;
end;

//=============================================================================
//  プリンタの設定を保存
//  PrinterSetupDialogは[プリンタの設定]ダイアログを[OK]で終了した時に発生する
//  イベント
//=============================================================================
procedure TForm1.plTackPrev1PrinterSetupDialog(Sender: TObject);
var
  AFileName: String;
begin
  AFileName := ExtractFilePath(Application.ExeName)+'plTackPrev1.plv';
  plTackPrev1.plSetPrinter.SaveToFile(AFileName);
end;

//=============================================================================
//  プレビューフォームの[閉じる]ボタンでも終了可能にする
//=============================================================================
procedure TForm1.plTackPrev1FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Close;
end;

//=============================================================================
//  マウスホイールは親のイベントを使用する
//  usseにplPrevfrmが必要
//=============================================================================
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
  SB : TScrollingWinControl;
begin
  if Assigned(PVForm) then begin
    SB := PVForm.ScrollBox1;
    if FindVCLWindow(MousePos) = SB then begin
      Handled := True;
      SB.VertScrollBar.Position := SB.VertScrollBar.Position - WheelDelta div 5;
    end;
  end;
end;

//=============================================================================
//  Button1Clickで実行する描画コード
//  指定座標値を中心とした十字を描き,そこを基準にしてルーチン名と同じ文字列を
//  描画していく
//=============================================================================
procedure TForm1.Test1(PV: TplPrev);
var
  X1 : Integer;
  X2 : Integer;
  Y1 : Integer;
  Y2 : Integer;
  Xc : Integer;
  Yc : Integer;
begin
  PV.BeginDoc;

  PV.FontSize(20);
  PV.FontName('Courier New');
  PV.PenWidth(1);
  PV.PenColor(clBlue);

  //指定座標の右下に文字列を描画
  X1  := 150;
  X2  := 700;
  Y1  := 300;
  Y2  := 550;
  Xc  := X1 + 150;
  Yc  := (Y1 + Y2) div 2;
  PV.Line  (X1, X2, Yc, Yc);
  PV.Line  (Xc, Xc, Y1, Y2);
  PV.TextOutLT(Xc, Yc, 'TextOutLT');

  //指定座標の右側に文字列を描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  Yc  := (Y1 + Y2) div 2;
  PV.Line  (X1, X2, Yc, Yc);
  PV.Line  (Xc, Xc, Y1, Y2);
  PV.TextOutLC(Xc, Yc, 'TextOutLC');

  //指定座標の右上に文字列を描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  Yc  := (Y1 + Y2) div 2;
  PV.Line  (X1, X2, Yc, Yc);
  PV.Line  (Xc, Xc, Y1, Y2);
  PV.TextOutLB(Xc, Yc, 'TextOutLB');

  //指定座標の下側に文字列を描画
  X1  := X1 + 600;
  X2  := X2 + 600;
  Y1  := 300;
  Y2  := 550;
  Xc  := (X1 + X2) div 2;
  Yc  := (Y1 + Y2) div 2;
  PV.Line  (X1, X2, Yc, Yc);
  PV.Line  (Xc, Xc, Y1, Y2);
  PV.TextOutCT(Xc, Yc, 'TextOutCT');

  //指定座標の上下左右に文字列を描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  Yc  := (Y1 + Y2) div 2;
  PV.Line  (X1, X2, Yc, Yc);
  PV.Line  (Xc, Xc, Y1, Y2);
  PV.TextOutCC(Xc, Yc, 'TextOutCC');

  //指定座標の上側に文字列を描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  Yc  := (Y1 + Y2) div 2;
  PV.Line  (X1, X2, Yc, Yc);
  PV.Line  (Xc, Xc, Y1, Y2);
  PV.TextOutCB(Xc, Yc, 'TextOutCB');

  //指定座標の左下に文字列を描画
  X1  := X1 + 600;
  X2  := X2 + 600;
  Y1  := 300;
  Y2  := 550;
  Xc  := X2 - 150;
  Yc:=(Y1 + Y2) div 2;
  PV.Line  (X1, X2, Yc, Yc);
  PV.Line  (Xc, Xc, Y1, Y2);
  PV.TextOutRT(Xc, Yc, 'TextOutRT');

  //指定座標の左側に文字列を描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  Yc  := (Y1 + Y2) div 2;
  PV.Line  (X1, X2, Yc, Yc);
  PV.Line  (Xc, Xc, Y1, Y2);
  PV.TextOutRC(Xc, Yc, 'TextOutRC');

  //指定座標の左上に文字列を描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  Yc  := (Y1 + Y2) div 2;
  PV.Line  (X1, X2, Yc, Yc);
  PV.Line  (Xc, Xc, Y1, Y2);
  PV.TextOutRB(Xc, Yc, 'TextOutRB');

  PV.EndDoc;
end;

end.




TFormPanel の修正


このページのサンプルでは,FmPnlReg.pas の Resister 部分を以下の様に修正し,Delphi 5 以降でも使用可能にしてテストしています.


リスト2 
procedure Register;
begin

    RegisterComponents('Takeuchi', [TFormPanel]);

{$IFDEF VER130}
        RegisterPropertyInCategory
                (TLegacyCategory,TFormPanel,'FormCaption');
{$ELSE}
        RegisterPropertyInCategory
                ('Legacy',TFormPanel,'FormCaption');
{$ENDIF}
end;