お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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