|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"フォーに連動する印刷プレビュー画面"
{
印刷プレビュー画面の表示には、フォームに大きさを固定するもの、
100%、用紙長など実際の用紙の大きさの比率で表示するもの、
フォームの大きさに連動して表示するもの、
と3種類にわけられます。
このサンプルはフォームの大きさに連動して
印刷画面の大きさを変えるものです。
uses 節にPrintersを追加して下さい。
Form1 に Panel1 を置いて、AlignプロパティをalClientにして下さい。
その上に PaintBox1 を置きます。
コンパイルして、フォームの大きさを変えると、それに連動して、印刷
画面の大きさも変わります。PrinterSetupDIalogなどを追加して、用紙
の向きを変えてみるとよくわかります。
}
procedure TForm1.PaintBox1Paint(Sender: TObject);
const m254=25.39999;
var pwx,pwy,pbx,pby,paneloffset,x1,x2,y1,y2:integer;
pwk,tbk,rb:real;
poffset,ppsize:Tpoint;
// funciton for wx
function wx(s:integer):integer;
var ss:integer;
begin
ss:=trunc(s*(PaintBox1.Width / ppsize.x));
if ss<0 then ss:=0;
wx:=ss;
end;
//function for wy
function wy(s:integer):integer;
var ss:integer;
begin
ss:=trunc(s*(PaintBox1.Height / ppsize.y));
if ss<0 then ss:=0;
wy:=ss;
end;
begin
// PaintBox1 の余白を設定
paneloffset:=10;
// PaintBox1 の位置を指定
PaintBox1.Left:=paneloffset;
PaintBox1.Top:=paneloffset;
// 印刷時の余白を取得
poffset.x:=GetDeviceCaps(Printer.Handle,PHYSICALOFFSETX);
poffset.y:=GetDeviceCaps(Printer.Handle,PHYSICALOFFSETY);
//印刷用紙の大きさを取得
ppsize.x:=GetDeviceCaps(Printer.Handle,PHYSICALWIDTH);
ppsize.y:=getdevicecaps(Printer.Handle,PHYSICALHEIGHT);
//印刷可能範囲の大きさを取得
pwx:=Printer.PageWidth;
pwy:=Printer.PageHeight;
// Panel1 の大きさの取得
pbx:=Panel1.Height-paneloffset*2;
if pbx<1 then pbx:=1;
pby:=Panel1.Width-paneloffset*2;
if pby<1 then pby:=1;
// 用紙のタテ・ヨコの比率
pwk:=ppsize.x / ppsize.y;
// Panel1 のタテ・ヨコの比率
tbk:=Panel1.Width / Panel1.Height;
// 用紙が縦長の場合
if ppsize.x<ppsize.y then
begin
if tbk>pwk then
begin
PaintBox1.Height:=pbx;
rb:=(pbx / ppsize.y);
PaintBox1.Width:=round((rb * ppsize.x)+0.9);
end
else
begin
PaintBox1.Width:=pby;
rb:=(pby / ppsize.x);
PaintBox1.Height:=round((rb * ppsize.y)+0.9);
end;// if tbk>pwk then
end
else
begin
if tbk<pwk then
begin
PaintBox1.Width:=pby;
rb:=(pby / ppsize.x);
PaintBox1.Height:=round((rb * ppsize.y)+0.9);
end
else
begin
PaintBox1.Height:=pbx;
rb:=(pbx / ppsize.y);
PaintBox1.Width:=round((rb * ppsize.x)+0.9);
end;//if tbk<pwk then
end;// if ppsize.x<ppsize.y then
with PaintBox1 do
begin
Canvas.Brush.Style:=bsSolid;
Canvas.Brush.Color:=clWhite;
Canvas.Pen.Color:=clWhite;
//印刷プレビューを白で表示
Canvas.Rectangle(0,0,Width,Height);
Canvas.Pen.Color:=clBlack;
x1:=wx(poffset.x);
x2:=wx(pwx+poffset.x);
y1:=wy(poffset.y);
y2:=wy(pwy+poffset.y);
//実際に印刷できる範囲を枠で囲む
Canvas.Rectangle(x1,y1,x2,y2);
{
ここに印刷するルーチンを入れます。
Printer.Canvas で印刷する座標を x,y とすると、大きさは、
WX(x+poffset.x)やWY(y+poffset.y)に入れておきます。
poffset.x poffset.y の値を変更することで、余白を指定できます。
}
end;// with paintbox1 do
end;
{
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 印刷範囲の長さ
ということです。プリンタドライバによって誤差が出ますので、正確な印刷
はなかなか難しいので、微調整をできるようにした方がいいでしょう。
}
----------------------------------------------------------------------
1997.11.25(火) 一品斎 CXD02261
======================================================================
Original document by 一品斎 氏 ID:(CXD02261)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|