title: PrevX
author: YOSHIDA Kazuhiro
mailto: moriq@moriq.com

1. Phi::PrevX

  エックス (KYY06770@nifty.ne.jp)さんの Delphi 用のフリーコンポーネント PrevX の Apollo 移植版です。

  元のソースは
    nifty:FDELPHI/LIB/08/909
    データ名：PrevX112.lzh 印刷プレビュー Ver 1.12
  にあります。

  : 注意
    クラス名は PrevX ですが，ライブラリ名は prev です。
    使うときは %c:require 'prev'% とします。

%c:Phi::PrevX% は， Delphi 5 用の印刷プレビュー コンポーネントです。

%c:Phi::PrevX% には以下の特徴があります。

印刷内容をプレビューすることができます。印刷内容とプレビュー内容は，ほぼ一致します。

プレビュー内容を拡大・縮小することができます。

内部にメタファイルを使用して効率的にプレビューイメージを記憶します。再描画が必要なときは自動で行われます。

%c:QuickReport% ほど複雑ではないので簡単に使用できます。

1.1. properties

: canvas : Phi::Canvas
  プレビュー内容を書き込むための描画領域です。

  このキャンバスに書き込むためには， #doc の中で記述する必要があります。

  : 注意
    この描画領域の座標系はピクセル単位となります。そのため，そのまま書き込むとプリンタの解像度の違いによって，印刷内容が異なってしまいます。そこで座標をミリからそれぞれのプリンタのピクセル単位に変換する必要があります。基本的なメソッドについては，自動で変換してくれるものを用意しているので，通常はそちらを使って下さい。用意されていないものを使用するには， #xpos ， #ypos を使用し，このキャンバスに書き込んで下さい。

    同様な理由で %c:canvas.pen% を設定する場合は， #pen_width を使用して設定してください。ただし，この場合は点線が使用できなくなる可能性があるので，その場合はそのまま 1 を代入して下さい。 (Windows95/98 では %c:pen.width% が 1 以外の場合，点線にできません。 )

: zoom_scale : Fixnum
  ズーム率を設定します。 100 でおおむね実寸に近くなります。最小 25 最大 200 です。

: count : Fixnum
  ページ数を取得します。

: index : Fixnum
  プレビューするページ番号を指定します。

: range : Range = 1..9999
  印刷するページ範囲を指定します。

: title : String
  印刷処理のタイトルを指定します。

: height : Fixnum
: page_height : Fixnum
  印刷用紙の高さを取得します。 取得した値の単位は #map_mode の値によって変わります。デフォルトでは 0.1mm 単位です。
  読み込み専用です。 #set_printer_mode で指定された用紙サイズ／用紙方向によって値が決まります。

: width : Fixnum
: page_width : Fixnum
  印刷用紙の幅を取得します。 取得した値の単位は #map_mode の値によって変わります。デフォルトでは 0.1mm 単位です。
  読み込み専用です。 #set_printer_mode で指定された用紙サイズ／用紙方向によって値が決まります。

: margin_left : Fixnum
  印刷の左マージンです。

  : 注意
    このプロパティの値は， #xpos の中で加えられるだけで，実際にプリンタの設定を変更するわけではありません。

: margin_top : Fixnum
  印刷の上マージンです。

  : 注意
    このプロパティの値は， #ypos の中で加えられるだけで，実際にプリンタの設定を変更するわけではありません。

: map_mode : Fixnum (PrevMapModes) = PMM_HI
  座標系の変換形式を設定します。

  : PMM_HI
    0.1mm 単位
  : PMM_LO
    1.0mm 単位

: visible : Boolean
  %c:true% ならコンポーネントを表示します。 %c:false% なら表示しません。

1.1. methods

: doc { }
  プレビューの前処理と後処理を行います。キャンバスに書き込む操作はこのブロックの中で行う必要があります。

: new_page : nil
  新しいページを作成します。 このメソッドを呼び出すと #page_count の値を一つ増やし， #canvas の設定をすべて初期化します。

: print : nil
  プレビュー内容を印刷することができます。 #range のページ範囲を印刷します。

: save(file_name : string) : nil
  プレビュー内容をファイルに保存します。メタファイル形式で保存します。

: xpos(x : Fixnum) : Fixnum
  印字するＸ座標を論理単位 (mm) から，物理単位 (pixel) に変換します。 %v:x% の単位は， #map_mode が %c:PMM_HI% の場合 0.1mm 単位， %c:PMM_LO% の場合 1.0mm 単位になります。

  このメソッドは #doc の中でないと正常に動作しません。

: ypos(y : Fixnum) : Fixnum
  印字するＹ座標を論理単位 (mm) から，物理単位 (pixel) に変換します。 %v:y% の単位は， #map_mode が %c:PMM_HI% の場合 0.1mm 単位， %c:PMM_LO% の場合 1.0mm 単位になります。

  このメソッドは #doc の中でないと正常に動作しません。

: pen_width(size : Fixnum) : Fixnum
  印字するペンの幅をプリンタのピクセル単位で返します。

  引数で渡す %v:size% は，線に微妙な幅を持たせるため， 10 倍の値を指定するようにしています。おおむね画面上の 0.1 ピクセル単位となります。

  このメソッドは #doc の中でないと正常に動作しません。

: text_out(x, y : Fixnum; str : String)
  文字列を出力します。

  基本的には， %c:Canvas% のものと同じですが，座標の単位がすべて論理単位となります。

  内部は，以下のようになっているだけです。
--code
  procedure TPrevX.TextOut(const x, y: Integer; const str: string);
  begin
    Canvas.TextOut(XPos(x), YPos(y), str);
  end;
--
  テキストのフォントには FixedSys のような固定フォントは使用しないで下さい。このようなフォントは大きさが固定なので，プレビュー時に拡大縮小しても大きさが変わりません。

: move_to(x, y : Fixnum)
  描画位置を移動します。

  基本的には， %c:Phi::Canvas% のものと同じですが，座標の単位がすべて論理単位となります。

  内部は，以下のようになっているだけです。
--code
  procedure TPrevX.MoveTo(const x, y: Integer);
  begin
    Canvas.MoveTo(XPos(x), YPos(y));
  end;
--
: line_to(x, y : Fixnum)
  線を引きます。

  基本的には， %c:Phi::Canvas% のものと同じですが，座標の単位がすべて論理単位となります。

  内部は，以下のようになっているだけです。
--code
  procedure TPrevX.LineTo(const x, y: Integer);
  begin
    Canvas.LineTo(XPos(x), YPos(y));
  end;
--
: rectangle(x1, y1, x2, y2 : Fixnum)
  長方形を描きます。

  基本的には， %c:Phi::Canvas% のものと同じですが，座標の単位がすべて論理単位となります。

  内部は，以下のようになっているだけです。
--code
  procedure TPrevX.Rectangle(const x1, y1, x2, y2: Integer);
  begin
    Canvas.Rectangle(XPos(x1), YPos(y1), XPos(x2), YPos(y2));
  end;
--
: round_rect(x1, y1, x2, y2, x3, y3 : Fixnum)
  角の丸い長方形を描きます。

  基本的には， %c:Phi::Canvas% のものと同じですが，座標の単位がすべて論理単位となります。

  内部は，以下のようになっているだけです。
--code
  procedure TPrevX.RoundRect(const x1, y1, x2, y2, x3, y3: Integer);
  begin
    Canvas.RoundRect(XPos(x1), YPos(y1), XPos(x2), YPos(y2), XPos(x3), YPos(y3));
  end;
--
: ellipse(x1, y1, x2, y2, x3, y3 : Fixnum)
  円・楕円を描きます。

  基本的には， %c:Phi::Canvas% のものと同じですが，座標の単位がすべて論理単位となります。

  内部は，以下のようになっているだけです。
--code
  procedure TPrevX.Ellipse(const x1, y1, x2, y2: Integer);
  begin
    Canvas.Ellipse(XPos(x1), YPos(y1), XPos(x2), YPos(y2));
  end;
--
: set_printer_mode(paper_size, orientation : Fixnum)
  プリンタの設定を行います。

  %v:paper_size% には用紙サイズを指定します。 これらの値は %c:Win:module% に定義されています。

  : DMPAPER_A3
    A3
  : DMPAPER_A4
    A4
  : DMPAPER_A5
    A5

  %v:orientation% には用紙の方向を指定します。 これらの値は %c:Win:module% に定義されています。

  : DMORIENT_PORTRAIT
    縦
  : DMORIENT_LANDSCAPE
    横

1.1. event handlers

: on_resize : nil
  サイズが変更された場合に呼ばれます。

1.1. 操作方法

1.1.1. プレビューしてみる

%href:preview.rb%

1.1.1. 印刷してみる

%href:print.rb%
