Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2001年02月04日] [更新 2016年04月30日] Query 印刷コンポーネント
   
Query 印刷コンポーネント
テストプログラム  ChangePage
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro







項目のグループ毎に改頁とイベントの使用例


GroupNewPage プロパティを True にすると,項目値のグループ毎に改頁することができます.集計値の印刷を指定している場合は,集計行の印刷の後に改頁します.この動作のテストプログラムです.また各イベントのテストも兼ねています. 


リスト1
Query1 の SQL プロパティ
SELECT T2.CustNo,
       T4.Company,
       T3.Description, 
       T2.SaleDate, 
       T3.ListPrice,
       T3.Cost,
       T1.Qty,
       T1.Qty*T3.Cost as Sales 
FROM   "Items.db" T1,
       "Orders.db" T2, 
       "Parts.db" T3, 
       "Customer.db" T4
WHERE  (T2.OrderNo = T1.OrderNo) AND 
       (T3.PartNo = T1.PartNo) AND 
       (T4.CustNo = T2.CustNo) AND
       (T4.CustNo <= 1351)
ORDER BY T2.CustNo, T3.Description, T2.SaleDate


図1
設計時画面
図2
グループ計の項目
  • Company と Description ごとに集計するのでこれらの項目の Grouping を True にしている
図3
改頁の指定
  • Company ごとに改頁するので,この項目の GroupNewPage を True に
図4
集計計算する項目

  • Qty と Sales の計を計算
  • これらの項目プロパティの SumPrint を True に

  • 図5 
  • 実行結果.最初の頁

  • 図6 
  • 実行結果.最後の頁.Company ごとの計 (グループ計) と総合計の値を印刷

リスト2
テストプログラムのコード
unit ChangePageUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, plPrev, plQueryPrev, DB, DBTables;

type
  TForm1 = class(TForm)
    Query1: TQuery;
    plQueryPrev1: TplQueryPrev;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure plQueryPrev1Footer(Sender: TObject; Page, YPos: Integer);
    procedure plQueryPrev1BeforePrintCell(Sender: TObject; Rect: TRect;
      ACol, ARow, PageRow: Integer; var Text: String; fDataRow: Boolean);
    procedure plQueryPrev1ReportStart(Sender: TObject; var YPos: Integer);
    procedure plQueryPrev1BeforeView(Sender: TObject; Page: Integer);
    procedure plQueryPrev1Header(Sender: TObject; Page, YPos: Integer);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

//=============================================================================
//  クエリの結果を印刷プレビュー
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Query1.Open;
  plQueryPrev1.Title := 'Queryの印刷例';
  plQueryPrev1.Preview;
end;

//=============================================================================
//  plQueryPrev1のOnReportStartイベント処理
//  OnReportStartイベントは最初の頁描画前に発生する
//  このイベントでは引数のYPosで印刷開始位置を変更できる
//=============================================================================
procedure TForm1.plQueryPrev1ReportStart(Sender: TObject;
  var YPos: Integer);
var
  LXl    : Integer;
  LXr    : Integer;
  LYt    : Integer;
  LYb    : Integer;
  LWidth : Integer;
  LPosX  : Integer;
  i      : Integer;
begin
  //最初の頁だけ描画開始Y座標を480とする
  YPos := 480;

  //回章用の捺印欄を作成
  plQueryPrev1.LineWidth(1);
  plQueryPrev1.LineColor(clBlack);

  LWidth := 150;
  LXl := plQueryPrev1.LeftMargin;
  LXr := plQueryPrev1.LeftMargin + LWidth * 4;
  LYt := 180;
  LYb := 220;

  plQueryPrev1.RectLine(LXl, LXr, LYt, LYb + 150);
  plQueryPrev1.Line(LXl, LXr, LYb, LYb);
  for i := 1 to 4 do begin
    LPosX := LXl + (i - 1) * LWidth;
    plQueryPrev1.Line(LPosX, LPosX, LYt, LYb + 150);
  end;

  //捺印欄の文字列
  plQueryPrev1.FontHeight (30);
  plQueryPrev1.TextRectCC (LXl,              LXl + LWidth,     LYt, LYb, '部  長');
  plQueryPrev1.TextRectCC (LXl + LWidth,     LXl + LWidth * 2, LYt, LYb, '課  長');
  plQueryPrev1.TextRectCC (LXl + LWidth * 2, LXl + LWidth * 3, LYt, LYb, '係  長');
  plQueryPrev1.TextRectCC (LXl + LWidth * 3, LXl + LWidth * 4, LYt, LYb, '担当者');
end;

//=============================================================================
//  plQueryPrev1のOnHeaderイベント勝利
//  各頁描画前に発生するイベント
//=============================================================================
procedure TForm1.plQueryPrev1Header(Sender: TObject; Page, YPos: Integer);
begin
   plQueryPrev1.TextOutLT(plQueryPrev1.LeftMargin, YPos, 'クエリーの印刷例');
end;

//=============================================================================
//  plQueryPrev1のOnFooterイベント処理
//  このイベントの後に該当ページの描画が行われる
//  この頁に印刷したCompanyの名前を用紙の上部に印刷
//  印刷の日時もフッタ部に印刷
//=============================================================================
procedure TForm1.plQueryPrev1Footer(Sender: TObject; Page,
   YPos: Integer);
var
  LText    : string;
  LLeft    : Integer;
  LTop     : Integer;
  LDateStr : string;
  LTimeStr : string;
begin
  //Columns[2]で取得するより項目名の方が明確
  LText := plQueryPrev1.DataSet.FieldByName('Company').AsString;

  //フォント名とサイズを設定
  plQueryPrev1.FontSize(12);
  plQueryPrev1.FontName('MS Pゴシック');

  LLeft := (plQueryPrev1.LeftMargin * 2 + plQueryPrev1.PrintWidth) div 2;
  LTop  := plQueryPrev1.TopMargin - 20;
  //最初の頁では印刷開始位置をOnReportStartで変更したので変える
  if Page = 1 then LTop := 480 - 10;

  plQueryPrev1.TextOutCB(LLeft, LTop, LText);

  //フッタ部に印刷日時を印刷
  //その文字のサイズ
  plQueryPrev1.FontSize(8);

  //印刷位置の右端は表の右端とする
  LLeft := plQueryPrev1.LeftMargin + plQueryPrev1.PrintWidth;
  LDateStr := FormatDateTime('yyyy"年"m"月"d"日"', Date);
  LTimeStr := FormatDateTime('h"時"m"分"s"秒"', Time);

  plQueryPrev1.TextOutRT(LLeft, YPos + 30, '印刷日付 : ' + LDateStr);
  plQueryPrev1.TextOutRT(LLeft, YPos + 60, '印刷時刻 : ' + LTimeStr);
end;

//=============================================================================
//  plQueryPrev1のOnBeforePrintCellイベント処理
//  各セルの描画前に発生するイベント
//  集計行のセルに背景色を設定
//=============================================================================
procedure TForm1.plQueryPrev1BeforePrintCell(Sender: TObject;
  Rect: TRect; ACol, ARow, PageRow: Integer; var Text: String;
  fDataRow: Boolean);
begin
  if fDataRow then exit;

  //色を指定
  //ARow = 0 は一番内側の小計行
  //このサンプルではARow = 2 は総合計
  if ARow = 0 then plQueryPrev1.Canvas.Brush.Color := $00E1FFEE;
  if ARow = 1 then plQueryPrev1.Canvas.Brush.Color := $00FFE8E8;
  if ARow = 2 then plQueryPrev1.Canvas.Brush.Color := $00FFF4DF;

  plQueryPrev1.FillRect(Rect.Left, Rect.Right, Rect.Top, Rect.Bottom);
end;

//=============================================================================
//  plQueryPrev1のOnBeforeViewイベント処理
//  引数のPageが描画される前に発生するイベント
//  頁番号を印刷
//  頁番号はこのイベントでないと取得できない
//=============================================================================
procedure TForm1.plQueryPrev1BeforeView(Sender: TObject; Page: Integer);
var
  LPageStr : string;
  LLeft    : Integer;
  LTop     : Integer;
begin
  //文字のサイズ
  plQueryPrev1.FontSize(10);

  //頁番号の文字列を作成して印刷
  //PageCountが総頁数
  LPageStr := IntToStr(Page) + '/' + IntToStr(plQueryPrev1.PageCount);
  LLeft    := plQueryPrev1.PaperWidth div 2;
  LTop     := plQueryPrev1.PaperHeight - plQueryPrev1.BottomMargin + 50;
  plQueryPrev1.TextOutCC(LLeft, LTop, LPageStr);
end;

end.