Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2001年02月04日] [更新 2016年05月01日] Query 印刷コンポーネント
Query 印刷コンポーネント
メソッド
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro で作成







プレビューの開始


Preview

プレビューを開始し,プレビューフォームを表示します.Ver4.0 では,Show メソッドを実行することによるトラブルを避けるために,ShowModal で表示する,この Preview メソッドを実装しました






指定頁の再描画


Display(Page): Boolean

引数で指定した頁の再描画を実行します.関数で,表示に失敗すると False を返します.Page<=0 の時は 1 頁を,PageCount よりも大きい値の時は PageCount の頁を表示します.

引数 説明
Page Integer 描画または表示する頁番号




プレビューなしで印刷


Print

プレビューをしないで印刷を実行します.PrintFromPage と PrintToPage プロパティで印刷開始と終了頁を指定します.




自動拡大縮小印刷のための基準用紙サイズ指定


DesignedPaperSize(W, H)

描画開始前にこのメソッドで設計時の用紙サイズを指定し,このサイズを基準に描画コードを書きます.プレビューまたは印刷は,プリンタ設定コンポーネント,またはプレビューの [プリンタ・用紙] で設定したサイズで実行します.縮小の場合は印刷のオフセットに注意する必要があります.印刷オフセットの値も縮小されます.
このメソッドは,帳票はA版で設計して,印刷の際にB版.(遠い) 将来A版に移行しても,再コンパイルをしなくてもいいようにするために作成したものです (いまだに B 版を使用しているところがあるということです).

引数 説明
W Integer 設計時の用紙幅
H Integer 設計時の用紙高さ




プレビューフォームを閉じる


Close

プレビューフォームの [閉じる] ボタン以外で閉じる必要がある場合に使用します.




メタファイルイメージの取得


GetMetaImage(Page): TMetaFile

引数で指定する頁のメタファイルイメージを取得または作成します.Page の値が 0 以下の時は 1 頁目,PageCount よりも大きい値の時は PageCoun tの頁のメタファイルイメージを取得します.

引数 説明
Page Integer 頁番号




追加メソッド


印刷プレビュー制御コンポーネントで説明している描画用の追加メソッドが使用できます.




protected 部の Execute メソッドとプレビューの再描画


Query 印刷コンポーネントは,印刷プレビュー制御コンポーネント (TplPrev) を継承したコンポーネントです.描画用のメタファイルを作成してから,それを印刷プレビュー,または印刷します.基本的には,プレビュー画面から用紙サイズ等の変更はできません.

メタファイルの作成開始は,protected 部の Execute メソッドで行われます.したがって,プレビュー中でも,このメソッドを実行すれば,再描画が可能です.以下は,この Execute メソッドを利用するコードとその実行結果です.
このサンプルでは,メインフォームのボタンクリックで継承フォームを表示していますが,TplPrev の説明にあるように,継承フォーム自身をメインフォームにすることもできます.



図1
設計時のメインフォーム
  • ボタンクリックで継承フォームを表示
図2
継承フォーム
  • TplQueryPrev, TQuery を配置
  • 右側に TPanel を配置
  • その TPanel の上にボタンを配置
図3
印刷項目
  • コードで追加するので何もなし

下図が実行結果です.[プリンタ設定] ボタンで印刷の方向を変更した結果です.
この継承フォームには TPanel を配置しています.その TPanel にボタンを配置しています.ボタンをクリックすると,別のクエリの実行結果をプレビュー表示できます.


図4
プレビュー開始
図5
[プリンタ設定] で印刷の方向変更
  • 印刷の方向を横にした結果

リスト1 
メインフォームのコード
uses に継承フォームのユニット名を追加している
//=============================================================================
//  プレビューフォームを表示
//  プレビューフォームは[プロジェクト][オプション]で自動生成から外しておく
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  plPrevForm1 := TplPrevForm1.Create(Self);
  try
    plPrevForm1.plQueryPrev1.Title := 'クエリー印刷のテスト';
    plPrevForm1.ShowModal;
  finally
    FreeAndNil(plPrevForm1);
  end;
end;


リスト2 
継承フォームのコード
var
  plPrevForm1: TplPrevForm1;

implementation

type
   TPVQueyr = class(TplQueryPrev);

{$R *.DFM}

//=============================================================================
//  このプレビューフォーム生成時の処理
//  クエリを実行して,その結果を表示
//=============================================================================
procedure TplPrevForm1.FormCreate(Sender: TObject);
var
  LColumn : TplQueryColumn;
begin
  with Query1 do begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT T2.CustNo,');
    SQL.Add('       T4.Company,');
    SQL.Add('       T3.Description,');
    SQL.Add('       T1.OrderNo, ');
    SQL.Add('       T3.ListPrice,');
    SQL.Add('       T3.Cost, ');
    SQL.Add('       T1.Qty,');
    SQL.Add('       T1.Qty*T3.Cost as Sales');
    SQL.Add('FROM   "Items.db" T1,');
    SQL.Add('       "Orders.db" T2,');
    SQL.Add('       "Parts.db" T3,');
    SQL.Add('       "Customer.db" T4 ');

    SQL.Add('WHERE  (T2.OrderNo = T1.OrderNo) AND ');
    SQL.Add('       (T3.PartNo = T1.PartNo) AND ');
    SQL.Add('       (T4.CustNo = T2.CustNo) AND ');
    SQL.Add('       (T4.CustNo=:Param ) ');
    SQL.Add('ORDER BY T2.CustNo,T3.Description ');
    ParamByName('Param').AsInteger := 1351;
    Open;
  end;

  //コードで印刷項目を指定
  //各項目のプロパティはデフォルトのまま
  plQueryPrev1.Columns.Clear;

  LColumn := plQueryPrev1.Columns.Add;
  LColumn.FieldName := 'CustNo';
  LColumn := plQueryPrev1.Columns.Add;
  LColumn.FieldName := 'Company';
  LColumn := plQueryPrev1.Columns.Add;
  LColumn.FieldName := 'Description';
  LColumn := plQueryPrev1.Columns.Add;
  LColumn.FieldName := 'OrderNo';
  LColumn := plQueryPrev1.Columns.Add;
  LColumn.FieldName := 'Cost';
  LColumn := plQueryPrev1.Columns.Add;
  LColumn.FieldName := 'Qty';
  LColumn := plQueryPrev1.Columns.Add;
  LColumn.FieldName := 'Sales';

  //必ず必要
  inherited;
end;

//=============================================================================
//  plQueryPrev1のOnReportStartイベント処理
//  [プリンタ設定]ボタンを表示
//
//  TplQueryPrevコンポはTplPrevの先読方式を使用している
//  先読み方式ではTplPrev.BeginDoc内で[プリンタ設定]ボタンを非表示にしている
//  TplPrev.BeginDocの実行後でないと[プリンタ設定]ボタンの表示制御ができない
//=============================================================================
procedure TplPrevForm1.plQueryPrev1ReportStart(Sender: TObject;
  var YPos: Integer);
begin
  plQueryPrev1.BtnOptions := plQueryPrev1.BtnOptions + [boPrinterSetBtn];
end;

//=============================================================================
//  プレビューフォームを表示したままで別のクエリを実行
//  以下のSQL文はWHERE句を変更しているだけ
//
//  SQL文は文字列のリストなので,実際には必要な部分だけ置き換えることも可能
//=============================================================================
procedure TplPrevForm1.plButton1Click(Sender: TObject);
begin
  with Query1 do begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT T2.CustNo,');
    SQL.Add('       T4.Company,');
    SQL.Add('       T3.Description,');
    SQL.Add('       T1.OrderNo, ');
    SQL.Add('       T3.ListPrice,');
    SQL.Add('       T3.Cost, ');
    SQL.Add('       T1.Qty,');
    SQL.Add('       T1.Qty*T3.Cost as Sales');
    SQL.Add('FROM   "Items.db" T1,');
    SQL.Add('       "Orders.db" T2,');
    SQL.Add('       "Parts.db" T3,');
    SQL.Add('       "Customer.db" T4 ');

    SQL.Add('WHERE  (T2.OrderNo = T1.OrderNo) AND ');
    SQL.Add('       (T3.PartNo = T1.PartNo) AND ');
    SQL.Add('       (T4.CustNo = T2.CustNo) AND ');
    SQL.Add('       (T4.CustNo=:Param ) ');
    SQL.Add('ORDER BY T2.CustNo,T3.Description ');
    ParamByName('Param').AsInteger := 1221;
    Open;
  end;

  //protected部のExecuteメソッドを実行
  TPVQueyr(plQueryPrev1).Execute;
  //表示更新
  plQueryPrev1.Display(plQueryPrev1.PageNumber);
end;

//=============================================================================
//  [プリンタ設定]ボタンのクリックイベント処理
//  プリンタの設定ダイアログを表示して,用紙サイズ等を設定する
//=============================================================================
procedure TplPrevForm1.PrinterSetBtnClick(Sender: TObject);
begin
  //元のコードを実行
  //元のコードは[プリンタの設定]ダイアログの表示]
  inherited;

  //protected部のExecuteメソッドを実行
  TPVQueyr(plQueryPrev1).Execute;
  //表示更新
  //最後に実行したSQL文で取得したデータを表示
  plQueryPrev1.Display(plQueryPrev1.PageNumber);
end;

end.