|
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.
このページのサンプルでは,FmPnlReg.pas の Resister 部分を以下の様に修正し,Delphi 5 以降でも使用可能にしてテストしています. |
procedure Register;
begin
RegisterComponents('Takeuchi', [TFormPanel]);
{$IFDEF VER130}
RegisterPropertyInCategory
(TLegacyCategory,TFormPanel,'FormCaption');
{$ELSE}
RegisterPropertyInCategory
('Legacy',TFormPanel,'FormCaption');
{$ENDIF}
end;
|