|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RichEditをPageRectの指定をして印刷する"
{
RichEdit のプロパティに PageRect があります。これは、RichEdit を印刷
するときに、用紙のどこに印刷するか、四角形で設定するものです。ここで
は、余白をmm単位で指定して印刷できるようにしました。
なお、Delphi3.1のPageRectのヘルプには間違いがありますので、下の補注を
確認して下さい。
uses 節にPrintersを追加して下さい。
Form1 に置くコントロールは次の通りです。
RichEdit1
Edit1 左余白
Edit2 右余白
Edit3 上余白
Edit4 下余白
Button1 印刷開始
Button1 を押すと、Edit1〜Edit4で指定した余白を設定して、RichEdit1を
印刷します。
EditはSpinEditに置き換ると使いやすいかもしれません。
}
uses printers;
procedure TForm1.Button1Click(Sender: TObject);
const m254=25.39999;
var rt:trect;
poffset,ppsize:Tpoint;
LOGX,LOGY,qpx,qpy,ql,qt,qr,qb:integer;
begin
//プリンタの解像度の取得
LOGX:=GetDeviceCaps(Printer.Handle,LOGPIXELSX);
LOGY:=GetDeviceCaps(Printer.Handle,LOGPIXELSY);
//プリンタの余白の取得(左、上)
poffset.x:=GetDeviceCaps(Printer.Handle,PHYSICALOFFSETX);
poffset.y:=GetDeviceCaps(Printer.Handle,PHYSICALOFFSETY);
//プリンタ用紙の大きさの取得(ヨコ、タテ)
ppsize.x:=GetDeviceCaps(Printer.Handle,PHYSICALWIDTH);
ppsize.y:=GetDeviceCaps(Printer.Handle,PHYSICALHEIGHT);
//プリンタ用紙の印刷できる範囲の取得(ヨコ、タテ)
qpx:=Printer.PageWidth;
qpy:=Printer.PageHeight;
//プリンタ用紙の余白の設定(左、上、右、下)
ql:=poffset.x;//左 余白
qt:=poffset.y;//上 余白
qr:=(ppsize.x-(qpx+poffset.x));//右 余白
qb:=(ppsize.y-(qpy+poffset.y));//下 余白
//印刷できる範囲の左上を原点として求めるため、Editで設定した
//数値から印刷余白(規定値)を引きます。
rt.Left:=Round((StrToIntDef(Edit1.Text,0)/m254*LOGX)-ql);
if rt.Left<0 then rt.Left:=0;
rt.Top:=Round((StrToIntDef(Edit3.Text,0)/m254*LOGY)-qt);
if rt.Top<0 then rt.Top:=0;
rt.Right:=Round(qpx-((StrToIntDef(Edit2.Text,qpx)/m254*LOGX)-qr));
if rt.Right<0 then rt.Right:=qpx;
rt.Bottom:=Round(qpy-((StrToIntDef(Edit4.Text,qpy)/m254*LOGY)-qb));
if rt.Bottom<0 then rt.Bottom:=qpy;
//印刷する範囲を格納します。
RichEdit1.PageRect:=rt;
//印刷します。
RichEdit1.Print('');
end;
{
補注:ヘルプのPageRectの説明で、
「サイズは twip (1 ポイントの 1/20) 単位で指定します。」とありますが、
これは間違いで、プリンターのピクセル単位で指定します。VCLコードでは、
内部でtwipに変換しています。
PageRect は TRect型で、設定しないと、
Left:=0;
Right:=Printer.PageWidth;
Top:=0;
Bottom:=Printer.PageHeight;
となります。これが規定値です。
なお、1 ポイントは 1/72 インチです。
twipはプリンターのピクセルを解像度で割り、1440を掛けると求められます。
これは、C++で使用するときに使うもので、Delphiでは使用しません。
poffset.x:=getdevicecaps(printer.handle,PHYSICALOFFSETX);
poffset.y:=getdevicecaps(printer.handle,PHYSICALOFFSETY);
ppsize.x:=getdevicecaps(printer.handle,PHYSICALWIDTH);
ppsize.y:=getdevicecaps(printer.handle,PHYSICALHEIGHT);
は、
+--------+-----------------+----------+
+-------------------------------------+ ppsize.x 用紙の長さ
+--------+ poffset.x 余白の長さ
+-----------------+ printer.pagewidth 印刷範囲の長さ
ということです。プリンタドライバによって誤差が出ますので、正確な印刷
はなかなか難しいので、微調整をできるようにした方がいいでしょう。
}
----------------------------------------------------------------------
1998.01.02(金) 一品斎 CXD02261
======================================================================
Original document by 一品斎 氏 ID:(CXD02261)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|