AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
DelphiXE3 [FMX]「プリンタ設定」画面(PrinterSetupDialog)2013/10/21
 
前頁で[Dialogs]内の「PageSetupDialog」(「ページ設定」画面)について書きました。次に同じく[Dialogs]内の「PrinterSetupDialog」(「プリンタ設定」画面)について見ていきます。
   【Delphi2010の記事はこちら】
   【DelphiXE3[VCLアプリケーション]の記事はこちら】
 
 


 
(ヘルプより)
TPrinterSetupDialog は、プリンタ設定ダイアログ ボックスを表示するためのクラスです。
 
TPrinterSetupDialog を使用すると、プリンタを構成するためのダイアログボックスを表示できます。
ダイアログ ボックスの内容は、選択されたプリンタドライバによって異なります。
 
メモ: このダイアログは、実行時に Execute メソッドの呼び出しによってアクティブになるまでは消えません。
メモ: TPrinterSetupDialog は、MAC 向けには実装されていません。
 
との事で、私はこの画面と、簡単な独自の印刷開始画面を用意して印刷プログラムを作成してきましたが、Mac向けには実装されていない=Macでは使えない?との事のようなので、もしかすると、これまでのような手法は使えないのかもしれません。となれば必然的に、「PrintDialog」(「印刷」画面)を使用しないといけないのかもしれません…。
 
それはさておき、下図のように配置し、下記のようにボタンのクリックイベントハンドラを記述します。

procedure TForm1.Button1Click(Sender: TObject);
begin
 PrinterSetupDialog1.Execute ;
end;
保存・コンパイル・実行をします。



 
ここで設定した内容は、プリンタ設定として、これまで同様、アプリケーション動作中は記憶され、プリンタオブジェクトのプロパティ値として読み取る事が出来ます。
 
uses節に「FMX.Printer」を記述し、
procedure TForm1.Button1Click(Sender: TObject);
var
 s : string ;
 dpix,dpiy : integer ;
begin
 PrinterSetupDialog1.Execute ;
 Printer.ActivePrinter.SelectDPI(600,600);
 dpix := Printer.ActivePrinter.ActiveDPI.X ;
 dpiy := Printer.ActivePrinter.ActiveDPI.Y ;
 
 s := 'プリンタ名:' + Printer.ActivePrinter.Device + #13+#10 ;
 s := s + '横:' + IntToStr(Printer.PageWidth) + 'dot' + #13+#10 ;
 s := s + '縦:' + IntToStr(Printer.PageHeight)+ 'dot' + #13+#10 ;
 s := s + '横:'+FloatToStr(Printer.PageWidth *25.4/dpix)+'mm'+#13+#10;
 s := s + '縦:'+FloatToStr(Printer.PageHeight*25.4/dpiy)+'mm'+#13+#10;
 ShowMessage(s);
end;
のように記述すると、

A4縦の場合




A3横の場合


となりますので、印刷可能領域サイズはこれで分かります。
(※この値は「印刷設定」画面のマージン設定とは無関係です)
 
ただ、ここで気になるとすれば、プログラム内で 600DPI であると指定している事です。実際には、SelectDPIメソッドで指定した解像度値に一番近い値が設定されるようで、例えば、SelectDPI(500,500)のように指定しても、そういう解像度はプリンタに存在しませんので、600dpiとして設定されて、その値で取得出来ます(※適正値を探すのに多少時間が掛かるようです)。
本当は、プリンタの詳細設定で指定された解像度値、というのを取得したいのですが、これがどうも取得出来ない様子です。Printer.ActivePrinter.ActiveDPIindexの値は「-1」を示し、Printer.ActivePrinter.ActiveDPI.X、Y の値は「0」となってしまいます。
 
Printer.PageWidth、Printer.PageHeightは、現在の解像度におけるドット(ピクセル)値となりますが、現在の用紙サイズが取得出来ない以上、現在の解像度を算出する事も出来ませんし、PageWidth、PageHeightはプリンタの印刷マージン(プリンタが印刷出来ない上下左右の領域)を除いた値でしょうから仮に用紙サイズが分かったとしても正確な解像度値の算出も難しいと思われます。
 
ですので、アプリケーション側で、印刷する解像度の指定が出来るようになっている方がいいと思われます。現在のプリンタで設定出来る解像度の一覧は、
for i := 0 to Printer.ActivePrinter.DPICount-1 do begin
 dpix := Printer.ActivePrinter.DPI[i].X;
 dpiy := Printer.ActivePrinter.DPI[i].Y;
 ・・・
end;
のようにすれば取得出来ます。
まぁ、設定、印刷、のタイミングをうまく取る、という前提はありますが。
 
プリンタ設定(プリンタ名・用紙サイズ・向き)→解像度設定→印刷
 
というのが1つのパターンですが、
プリンタ設定画面が使えないとなると、印刷画面からプリンタ設定を行う事になるため、上記のような単純一方向の処理では済まなくなってしまいます。
 
ですが、
インクジェットプリンタでの 360dpi と レーザープリンタでの 300dpi、
インクジェットプリンタでの 720dpi と レーザープリンタでの 600dpi、
インクジェットプリンタでの 1440dpi と レーザープリンタでの 1200dpi、
これを「似たようなものだ」とアバウトに同等に扱ってしまって、
解像度は、150/300/600/1200/2400/4800 のうちから選択
のような手法も「アリ」かもしれません。
SelectDPIメソッドは、現在のプリンタでの適正値を検索するようになっていますから、そこから正しい解像度値を取得して、実際の計算等に利用するようにすれば、プログラミング問題としては単純化されます。
 
 
非ビジュアルコンポーネントですので、スタイルは無関係ですからそれについては記述しません。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
>DelphiXE3
▲2013/10/21
 2013/10/21
▼2013/10/22
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.