Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2000年05月07日] [更新 2016年04月20日] プリンタ設定コンポーネント
   
プリンタ設定コンポーネント
用紙と解像度関係のプロパティ
動作確認等 図は Windows 7 U64(SP1) + Delphi XE(UP1) Pro で作成





凡例  published
 public
 ReadOnly



用紙関係のプロパティ


用紙サイズ等のプロパティです.これらの値はドット数です.
これらの値は,一般的に,プリンタあるいはプリンタドライバによって違う値になります.また,用紙サイズとプリンタの解像度によっても異なる場合があります.

オフセットの範囲外に描画コードを書いてもクリップされて印刷できません.これは,プリンタの物理的な特性によるものです.


[備考]
右端と下端のオフセットの定義が,一般的に使用されている用語と意味が違っています.
既にこのコンポーネントを利用したアプリケーションを多く作成してしまっているため,変更の予定はありません.ご了承下さい.


図1
用紙サイズとページの幅と高さ
  • ページ幅と高さは,印刷する用紙サイズによって異なる
  • 同じ用紙サイズでも,プリンタによって違うことがある
図2
オフセット値
  • 点線の内側が描画可能 (印刷可能) 領域
  • オフセット値は,プリンタによって異なる
  • 左と上のオフセット値も,使用する用紙によっても異なる場合がある

 Orientation TPrinterOrientaion 印刷方向.取得,設定とも以下の値
これらの定数の使用には uses に Printers が必要
poPortrait  縦
poLandscape 横
 PaperName String 用紙サイズ名称
用紙サイズの名称は,プリンタドライバによって,例えば同じ A4 でも異なる場合がある
 PaperNumber Integer 用紙サイズ番号
一般的に識別子で指定する
[例]
DMPAPER_A4 (A4シート、 210×297 ミリメートル)
 PaperWidth Integer 用紙幅のドット数
 PaperHeight Integer 用紙長さのドット数
 PageWidth Integer 印刷可能な横方向のドット数 (頁幅)
 PageHeight Integer 印刷可能な縦方向のドット数 (頁長さ)
 LeftOffset Integer 用紙左端オフセット値.ドット数
 TopOffset Integer 用紙上端オフセット値.ドット数
 RightOffset Integer 印刷可能な右端ドット数
 BottomOffset Integer 印刷可能な下端ドット数


横方向のドット数と解像度から,選択した用紙の幅を 0.1 mm と 0.01 inch 単位の値に換算して,それぞれの変数に代入する例です.


リスト1
procedure TForm1.Button3Click(Sender: TObject);
var
  LPaperWmm : Integer;
  LPaperWinch : Integer;
begin
  //0.1mm単位に換算
  LPaperHmm := Trunc(plSetPrinter1.PaperWidth * 254.0 / plSetPrinter1.XResolution);
  //0.01inch単位に換算
  LPaperHinch := Trunc(plSetPrinter1.PaperWidth * 100.0 / plSetPrinter1.XResolution);
end;


縦方向のドット数と解像度から,選択した用紙の長さを 0.1 mm と 0.01 inch 単位の値に換算してそれぞれの変数に代入する例です.


リスト2
procedure TForm1.Button2Click(Sender: TObject);
var
  LPaperHmm : Integer;
  LPaperHinch : Integer;
begin
  //0.1mm単位に換算
  LPaperHmm := Trunc(plSetPrinter1.PaperHeight * 254.0 / plSetPrinter1.YResolution);
  //0.01inch単位に換算
  LPaperHinch := Trunc(plSetPrinter1.PaperHeight * 100.0 / plSetPrinter1.YResolution);
end;




横と縦方向の解像度


これらのプロパティは,プリンタの 1 インチあたりのドット数を返します.プリンタによっては複数の解像度を持つもの,また横と縦 (長さ) 方向で解像度が異なる場合もあります.

 XResolution Integer 横方向の解像度
 YResolution Integer 縦方向の解像度




プロパティダイアログによる解像度の設定例


プリンタドライバによって設定の方法が違う場合があります.解像度を直接指定できるものと,印刷の品質名称で変更するものがあります.
正確には印刷の品質と解像度とは違い,同じ解像度でも印刷品質を向上させているプリンタもあるようです.実際の解像度は,プロパティで知ることができます.


図3
プロパティ設定ダイアログの [詳細設定]
  • グラフィックスの項目の [印刷品質]
  • 横×縦の解像度のリストがある




用紙サイズや解像度取得の注意 ( 複数使用の場合 )


このページで説明している読出し専用のプロパティ,用紙幅、長さや解像度は,取得時のプリンタの現在の設定値となります.
本コンポーネントを複数個使用して,別々の設定内容とした場合,別の設定に切替えるには,以下のように,CallSetting を実行してプリンタ (コンポーネントの設定) を切替えて下さい.あるいは,設定内容をファイルに保存して,必要な時に呼出します.そのためのメソッドを用意しています.

システムで有効なプリンタオブジェクトは 1 つだけです.複数のプリンタオブジェクトを同時に有効にすることはできません.



リスト3 
procedure TForm1.Button1Click(Sender: TObject);
var
  LPaperWidth1 : Integer;
  LPaperWidth2 : Integer;
  LDPI1        : Integer;
  LDPI2        : Integer;
begin
  //ここで現在のプリンタがplSetPrinter1のものになる
  plSetPrinter1.PaperNumber := DMPAPER_B5;

  //plSetPrinter1(現在)のプリンタの値が取得されてしまう
  LPaperWidth1   := plSetPrinter2.PaperWidth;
  LDPI1          := plSetPrinter2.XResolution;
  Panel1.Caption := IntToStr(LPaperWidth1);
  Panel2.Caption := IntToStr(LDPI1);

  //plSetPrinter2にプリンタを切換ればOK
  //CallSettingはプリンタの切換を行うので少し時間がかかる.多用は禁物
  plSetPrinter2.CallSetting;

  //plSetPrinter2のプリンタの値が取得される
  LPaperWidth2   := plSetPrinter2.PaperWidth;
  LDPI2          := plSetPrinter2.XResolution;
  Panel3.Caption := IntToStr(LPaperWidth2);
  Panel4.Caption := IntToStr(LDPI2);
end;