Delphi Programming / Object Pascal
[掲載 2001年02月04日] [更新 2016年04月30日] Query 印刷コンポーネント |
Query 印刷コンポーネント
テストプログラム ChangePage |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE(UP1) Pro |
GroupNewPage プロパティを True にすると,項目値のグループ毎に改頁することができます.集計値の印刷を指定している場合は,集計行の印刷の後に改頁します.この動作のテストプログラムです.また各イベントのテストも兼ねています. |
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 に
|
- 図6
- 実行結果.最後の頁.Company ごとの計 (グループ計) と総合計の値を印刷
|
|
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.
|