とりあえずプリンタダイアログを置く |
![](img/Delphi_TPrinter1.png)
|
@フォーム上にTPrintDialogコンポーネントとかTPrinterSetupDialogコンポーネントを置きます。
AUSES に「Printers」を加える。 |
印刷ダイアログからの印刷処理 |
|
以下のソースコードは「ボタンをクリックしてダイアログ表示してから印刷する」手順です。
ダイアログで設定した情報は、自動的にTPrinterに設定されます。
詳細は、更に下の情報を参考にしてください。 |
procedure TForm.ButtonClick(Sender: TObject);
begin
if PrintDialog.Excute then
begin
end;
end;
|
@プリンター情報の取得 |
|
以下のソースコードは「TPrinterに設定されているプリンタに適切なサイズのキャンバスを用意するためにプリンタ情報を取得する」手順です。
宣言している変数は、印刷手続きのところに書き足してください。 |
var
dpiX,dpiY,OffsetX,OffsetY:Integer;
DotX,DotY:Extended;
begin
dpiX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
dpiY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
OffsetX := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
OffsetY := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
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を用意しています。 |
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;
|