■TPrinterを使った印刷

■メタファイルの使い方

■Queryの利用(IB&FB)

■TeeChart

■TExcelApplication

とりあえずプリンタダイアログを置く


@フォーム上にTPrintDialogコンポーネントとかTPrinterSetupDialogコンポーネントを置きます。
AUSES に「Printers」を加える。
印刷ダイアログからの印刷処理
  以下のソースコードは「ボタンをクリックしてダイアログ表示してから印刷する」手順です。
ダイアログで設定した情報は、自動的にTPrinterに設定されます。
詳細は、更に下の情報を参考にしてください。

procedure TForm.ButtonClick(Sender: TObject);
begin
if PrintDialog.Excute then//プリントダイアログを表示して、返値がTrue(OKボタンを押す)だったら印刷を行います。
begin
//@まず、プリンター情報を取得し、適切なキャンバスを用意します。
//Aキャンバスに印字を開始します。

end;
end;

@プリンター情報の取得
  以下のソースコードは「TPrinterに設定されているプリンタに適切なサイズのキャンバスを用意するためにプリンタ情報を取得する」手順です。
宣言している変数は、印刷手続きのところに書き足してください。
var
dpiX,dpiY,OffsetX,OffsetY:Integer;//デバイス情報格納
DotX,DotY:Extended;//1mmあたりのドット数

begin
//解像度の取得
dpiX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
dpiY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
//プリンタの持つ余白サイズのピクセル取得
OffsetX := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
OffsetY := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
//1mmあたりのドット数
DotX := dpiX / 25.4;
DotY := dpiY / 25.4;

end;

GetDeviceCapsで得られる情報一覧

GetDeviceCapsの第2引数 返値単位 意味
HORZSIZE mm
印刷可能領域の幅
VERTSIZE mm
印刷可能領域の高さ
HORZRES pixel
印刷可能領域の幅
VERTRES pixel
印刷可能領域の高さ
LOGPIXELSX dpi
横方向の論理インチ
LOGPIXELSY dpi
縦方向の論理インチ
PHYSICALWIDTH pixel
余白を含む紙の幅
PHYSICALHEIGHT pixel
余白を含む紙の高さ
PHYSICALOFFSETX pixel
用紙の左端から印刷可能領域までの距離
PHYSICALOFFSETY pixel
用紙の上端から印刷可能領域までの距離

Aキャンバスに印字
  以下のソースコードは「TPrinter.Canvasに印字する」手順です。
TPrinterのCanvasに印字したものが、用紙に印字されます。

var
cnt:Integer;//ループカウンタ
LastPage:Integer;//最終ページ
begin
//印刷スプールに表示されるタイトルを設定します。
Printer.Title := 'テスト印刷';
//
Printer.BrginDoc;
try
for cnt := 1 to LastPage do
begin
//印字します。詳細は次項
Printer.Canvas.DrawText(TPrinter.Handle,PChar(Edit1.Text),-1,TRect,);
Printer.Canvas.Draw(X,Y,TGrafic);
Printer.Canvas.StrechDraw(TRect,TGrafic);
//次のページの印字に移行します。
Printer.NewPage;
end;
except
//例外処理を行います。
Printer.Abort;
raise;
end;
Printer.EndDoc;
end;

各印字方法
  簡単な文字列は「DrawText」と「DrawTextEx」メソッドを使います。
例文は、指定した長方形内で中寄せ中浮きにしています。
DrawTextEX(Handle,PChar(Edit1.Text),-1,TRect,DT_SINGLELINE + DT_VCENTER + DT_CENTER,Nil);
メモ帳は「DT_LEFT」と「DT_WORDBREAK」オプションで実現します。
DrawTextEx(Handle, PChar(Edit1.text), -1,TRect,DT_LEFT or DT_WORDBREAK,nil);
画像やメタファイルは,「Draw」や「StrechDraw」を使います。
Drawの場合は、始点情報が必要です。Draw(左始点,上始点,画像情報);
StrechDrawは、矩形情報が必要であらかじめ、TRectを用意します。引数内で宣言してもいいけど、長くなるから別変数の利用がおすすめです。
StrechDraw(矩形情報,画像情報);
Draw(Left,Top,TImage.Graphic);
StrechDraw(TRect,TImage.Graphic);
位置関係
 

「おいおい、プリンター情報使ってないじゃん」と思われてると思いますが、矩形情報「TRect」を用意するときに使います。
たとえばA4サイズ(W210mmxH297mm)の場合、用紙サイズのキャンバスの幅(ピクセル)と高さ(ピクセル)は、
210 * GetDeviceCaps(Printer.Handle, LOGPIXELSX) / 25.4
297 * GetDeviceCaps(Printer.Handle, LOGPIXELSY) / 25.4
で割り出せます。
ただ、毎度毎度この式を作るのが面倒なので、上記で用意した変数DotX,DotYを用意しています。

//紙の左から50mm、紙の上端から70mmのところに10mm角の□を描画してその中に「好き」と印字します。
//PEN,BRUSH,FONTの設定は省きます。

var
FieldRect:TRect;
begin
//位置設定
FieldRect.Left := Round(50 * DotX - OffsetX);
FieldRect.Top := Round(70 * DotY - OffsetY);
FieldRect.Right := Round((50 + 10) * DotX - OffsetX);
FieldRect.Bottom := Round((70 + 10) * DotY - OffsetY);

//描画
Printer.Canvas.Rectangle(FieldRect);
Printer.Canvas.DrawText(Handle,PChar('好き'),-1,FieldRect,DT_SINGLELINE + DT_VCENTER + DT_LEFT);
end;


Copyright 2011 studio-take All Rights Reserved.