Delphi Programming / Object Pascal
[掲載 2000年12月12日] [更新 2016年04月19日] 印刷プレビュー制御コンポーネント |
印刷プレビュー制御コンポーネント
テキスト文書の描画 |
動作確認等 |
図は Windows 7 U64(SP1) + Delphi XE(UP1) Pro で作成 |
テキスト,あるいはテキスト文書の描画については,サンプルプログラム集の以下の記事も参考にしてください.
これらのサンプルでは,通常のテキストファイルも扱えます.TRichEdit は,ある程度の禁則処理も行ってくれるようです.テキストの属性等も設定ができ,本コンポーネントのテキスト描画用のメソッドよりも処理が高速です. |
TextOutFile(Yt, Xl, Xr, RowH, FileName): Integer
関数です.ディスク内にあるテキストファイルを読込んで,引数で指定する X 座標の範囲に両端揃えで描画します.描画の下端位置は BottomMargin プロパティで設定した値です.頁を越えての描画はしません (Ver 3.2 で 2 文字固定の禁則処理を実装しました).
終了すると,次の印刷開始 Y 座標値を返します.テキストファイルの内容が空の場合は描画開始位置の Yt の値を返します. |
引数 |
型 |
説明 |
Yt |
Integer |
描画開始 Y 座標値 |
Xl |
Integer |
描画範囲の左端 X 座標値 |
Xr |
Integer |
描画範囲の左端 X 座標値 |
RowH |
Integer |
行間隔で 0.1 mm 単位の値
行間隔は文字の高さと行間のスペースの合計値 |
FileName |
String |
フルパスのテキストファイル名を指定 |
StringListOut(SL,
Options,
Xl,
Xr,
Yt,
Yb,
RowH,
KinsokuCnt): Integer
関数です.TStringList 内のテキストファイルを引数で指定する領域内に描画します.頁を越えての描画はしません.必要であれば,改頁処理を行い,戻値の TStringList を次頁以降に描画する処理をして下さい.
終了すると,次の印刷開始Y座標値を返します.元の TStringList が空の場合は描画開始位置の Yt の値を返します. |
引数 |
型 |
説明 |
var SL |
TStringList |
描画するテキストを収めた TStringList
終了すると,指定領域内に描画出来なかった残りのテキストが入っている
また,1 行 (改行まで) の残りの文字列がインデック [0] に入っている |
Options |
TFormatOptions |
DHGL の GetTextPositionのOptions の値で,以下の値
何も指定しない時は左端揃え
foJustify 両端揃え
foEven 均等割付
foRight 右端揃え
foCenter 中央揃え
foKerning カーニングを行う |
Xl |
Integer |
描画領域の左端 X 座標値 |
Xr |
Integer |
描画領域の右端 X 座標値 |
Yt |
Integer |
描画領域の上端 Y 座標値 |
Yb |
Integer |
描画領域の下端 Y 座標値 |
RowH |
Integer |
行間隔で 0.1 mm 単位の値
行間隔は文字の高さと行間のスペースの合計値 |
KinsokuCnt |
Integer |
省略可能
禁則処理する文字数の指定
省略時の値は 2
0 の時は禁則処理を行わない
禁則文字についてはは plPrev.pas 内のコード参照 |
|
図1
実行画面例 (1 頁目) |
リスト1
複数頁にテキストを印刷する例 (先読み方式)
DHGL の TextUtils が必要 |
uses
TextUtils;
{$R *.DFM}
//=============================================================================
// ディスクからテキストを読込んで設定したマージン内に印刷
// 1頁で終了しない場合は次頁に印刷する
//
// 禁則処理を行うこのコードは,プレビューまで時間がかかる
//
// usesにTextUtils(中村拓男氏作)が必要
//=============================================================================
procedure TForm1.BitBtn1Click(Sender: TObject);
var
LStringList : TStringList;
LOptions : TFormatOptions;
LRowH : Integer;
LStartY : Integer;
begin
//テキストを保持するTStringList作成
LStringList:=TStringList.Create;
LOptions := [foJustify];
try
//TStringListにテキストを読込む
LStringList.LoadFromFile('001.txt');
plPrev1.TopMargin := 300; //上端マージン
plPrev1.BottomMargin := 250; //下端マージン
plPrev1.LeftMargin := 300; //左端マージン
plPrev1.RightMargin := 250; //右端マージン
LRowH := 60; //行幅
plPrev1.BeginDoc;
plPrev1.FontSize(10.5);
plPrev1.FontName('MS P明朝');
try
while True do begin
if plPrev1.PageNumber = 1 then begin
LStartY := 900;
end else begin
LStartY := plPrev1.TopMargin;
end;
plPrev1.StringListOut(LStringList,
LOptions,
plPrev1.LeftMargin,
plPrev1.PaperWidth - plPrev1.RightMargin,
LStartY,
plPrev1.PaperHeight - plPrev1.BottomMargin,
LRowH);
//描画領域に3mmの余白をつけてブルーの枠線を描画
plPrev1.PenColor(clBlue);
plPrev1.PenWidth(3);
plPrev1.RectLine(plPrev1.LeftMargin - 30,
plPrev1.PaperWidth - plPrev1.RightMargin + 30,
LStartY - 30,
plPrev1.PaperHeight - plPrev1.BottomMargin + 30);
if LStringList.Count = 0 then break;
//改頁
plPrev1.NewPage;
end;
finally
plPrev1.EndDoc;
end;
//プレビュー開始
plPrev1.ShowModal;
finally
FreeAndNil(LStringList);
end;
end;
テキスト文書の描画メソッドでは,行間や禁則処理を行っているため,処理に時間がかかる場合があります.行間指定が不要で,単にテキストファイルを読込みんで印刷するだけであれば以下のコードで十分です.
ただし,このコードでは複数頁にまたがる印刷はできません.
この他にも,サンプルプログラム集に,印刷プレビュー制御コンポーネントを使用したテストプログラムがあります.参考にしてください. |
リスト2
行間や禁則処理をしないテキストファイルの印刷 |
//=============================================================================
// 行間や禁則処理なしのテキスト文書の印刷
// 複数ページは不可
//=============================================================================
procedure TForm1.BitBtn1Click(Sender: TObject);
var
LRect : TRect;
LStringList : TStringList;
begin
//印刷領域の設定
LRect := Rect(plPrev1.LeftMargin,
plPrev1.TopMargin,
plPrev1.PaperWidth,
plPrev1.PaperHeight);
plPrev1.BeginDoc;
LStringList := TStringList.Create;
try
//テキストファイルを読み込む
LStringList.LoadFromFile('001.txt');
plPrev1.FontName('MS ゴシック');
DrawTextEx(plPrev1.Canvas.Handle,
PChar(LStringList.Text),
-1,
LRect,
DT_LEFT or DT_WORDBREAK,
nil);
finally
FreeAndnil(LStringList);
plPrev1.EndDoc;
end;
//プレビュー開始
plPrev1.ShowModal;
end;
|