Delphi Programming / Object Pascal
[掲載 2001年02月04日] [更新 2016年05月01日] Query 印刷コンポーネント |
Query 印刷コンポーネント
メソッド |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE(UP1) Pro で作成 |
プレビューを開始し,プレビューフォームを表示します.Ver4.0 では,Show メソッドを実行することによるトラブルを避けるために,ShowModal で表示する,この Preview メソッドを実装しました |
引数で指定した頁の再描画を実行します.関数で,表示に失敗すると False を返します.Page<=0 の時は 1 頁を,PageCount よりも大きい値の時は PageCount の頁を表示します. |
引数 |
型 |
説明 |
Page |
Integer |
描画または表示する頁番号 |
プレビューをしないで印刷を実行します.PrintFromPage と PrintToPage プロパティで印刷開始と終了頁を指定します. |
描画開始前にこのメソッドで設計時の用紙サイズを指定し,このサイズを基準に描画コードを書きます.プレビューまたは印刷は,プリンタ設定コンポーネント,またはプレビューの [プリンタ・用紙] で設定したサイズで実行します.縮小の場合は印刷のオフセットに注意する必要があります.印刷オフセットの値も縮小されます.
このメソッドは,帳票はA版で設計して,印刷の際にB版.(遠い) 将来A版に移行しても,再コンパイルをしなくてもいいようにするために作成したものです (いまだに B 版を使用しているところがあるということです). |
引数 |
型 |
説明 |
W |
Integer |
設計時の用紙幅 |
H |
Integer |
設計時の用紙高さ |
プレビューフォームの [閉じる] ボタン以外で閉じる必要がある場合に使用します. |
GetMetaImage(Page): TMetaFile
引数で指定する頁のメタファイルイメージを取得または作成します.Page の値が 0 以下の時は 1 頁目,PageCount よりも大きい値の時は PageCoun tの頁のメタファイルイメージを取得します. |
印刷プレビュー制御コンポーネントで説明している描画用の追加メソッドが使用できます. |
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;
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.
|