ダイアグロボックスを使用しないで、用紙サイズをA4にするには?

解決


超初心者  2009-01-30 09:30:40  No: 141394

印刷のコードをかいてみたいのですが、ダイアグロボックスを表示しないで、用紙サイズをA4に設定するには、どう記載すればいいのでしょうか?
サンプルをいろいろ探してみたのですが、すべて、ダイアグロボックスを表示させて、用紙サイズ、印刷方向などを設定して、印刷をはじめるコードはいくつかみました。
ダイアグロボックスを表示させなくても、A4サイズの用紙で印刷はでききるのですよね。
MSDNでいろいろ探しました。
http://msdn.microsoft.com/ja-jp/library/system.drawing.printing.pagesettings.papersize.aspx
のページを見ましたが、よくわかりませんでした。

      printDoc.DefaultPageSettings.PaperSize = _
        printDoc.PrinterSettings.PaperSizes.Item("A4")

このように記述してもだめでした。
どなたか、アドバイスをお願いもうしあげます。


魔界の仮面弁士  2009-01-30 12:32:59  No: 141395

グロでは無くログです。ダイアログボックス(dialog box)。

こちらは如何でしょう。サンプルでは、コンボボックスに表示してから
印刷させていますが、手を加えれば今回の目的の動作になるかと。
http://dobon.net/vb/dotnet/graphics/printcomboboxsize.html


超初心者  2009-02-01 05:54:31  No: 141396

魔界の仮面弁士さま
お返事ありがとうございました。

PrintDocument1.DefaultPageSettings.PaperSize = _
    CType(ComboBox1.SelectedItem, System.Drawing.Printing.PaperSize)

PrintDocument1.DefaultPageSettings.PaperSize = _
    CType("A4", System.Drawing.Printing.PaperSize)
としてもダメでしたので、

http://dobon.net/vb/bbs/log3-4/1971.html#ID2004

        Dim pPaperSz As System.Drawing.Printing.PaperKind

        '用紙サイズ-'A4にする
        pPaperSz = Printing.PaperKind.A4
        Dim pkSize As System.Drawing.Printing.PaperSize

        For Each pkSize In pd.PrinterSettings.PaperSizes
            If pkSize.Kind = pPaperSz Then
                pd.DefaultPageSettings.PaperSize = pkSize
            End If
        Next

を参考に記述すれば、エラーも出ずに、なんとかできそうでした。
ただ、
用紙サイズを決めるので、どうして、
For Each  In

Next
のループ構文を使うのでしょうか?
VB6ですと、
    Printer.PaperSize = vbPRPSA4
一行ですんでいました。
本当に難しいです。
よろしくお願い申し上げます。


魔界の仮面弁士  2009-02-02 19:55:01  No: 141397

> を参考に記述すれば、エラーも出ずに、なんとかできそうでした。
発見した時点で、「Exit For」にてループ検索を打ち切ったほうが良いでしょう。

さらに言えば、「A4 が見つからなかった場合」に対する動作も決めねばなりません。
たとえば以下の案が思いつきますが……今の段階では c 案が採用されていますね。

  (a) A4 が見つからなければ、メッセージを表示して、ユーザーに用紙一覧から選ばせる。
  (b) A4 が見つからなかったら、例外を発生させて処理する。
  (c) A4 が無ければ、現在設定されている用紙をそのまま使って出力する。
  (d) A4 が無い時は、サポートしている中で最も近いサイズの用紙をセットする。
  (e) 他のプリンタの中で A4 をサポートする物を探し、それを修正候補にする。

> 用紙サイズを決めるので、どうして、
実行環境が限定されている場合に限って言えば、ループさせずに、
  〜 = New PaperSize("A4", 1169, 827)
などの記述によって直接代入できます。

ただしこの場合、RawKind = Custom になってしまうため、A4 ではなく、
A4 サイズのユーザー定義用紙の意味になってしまい、ドライバによっては
望ましい結果にならない物も存在するため、事前に動作確認が必要です。

> For Each のループ構文を使うのでしょうか?

何故列挙させねばならないのかというと、.NET Framework 自体の設計に
よるものなので仕方ないとも言えるのですが、その実装の背景には、
プリンタドライバごとに使用可能な用紙セットが異なるという事情があります。

たとえば同じ A4 用紙であっても、その用紙名(PaperSize プロパティ)はまちまちです。
  「A4 (210x297mm)」… NEC マルチライタ系ドライバ
  「A4 210 x 297 mm」… Epson オフィリオ系ドライバ
  「A4」… Canon LIPS4 ドライバ
この他 OS 付属のプリンタ ドライバ(Microsoft Unidrv)は、「A4」ですね。
また、A4 縦と A4 横で違う用紙名を持つドライバもあります。

加えて、プリンタ側の用紙サポートの違いもあります。たとえば、
はがき印刷用の携帯用小型プリンタでは、A3 や A4 は 印刷はできません。
サポートしていないサイズを指定した場合の動作は、プリンタによって異なります。
(エラーになる物もあれば、別用紙として動作するものもあります)

そこで、「サポートされている用紙の一覧」をプリンタ側に問い合わせ、
その一覧の中から選択すると言う設計になっているのだと考えられます。

> VB6ですと、
>    Printer.PaperSize = vbPRPSA4
> 一行ですんでいました。
上記のような事情から、この設定が期待通りの結果にならない事もありますが、
その事は、VB6 ヘルプにも記載されていたりします。

》PaperSize プロパティ
》(中略)
》メモ
》 Printer オブジェクトのプロパティを設定する場合、その設定の結果は
》 プリンタ メーカーが提供するドライバによって異なります。プロパティを
》 設定しても効果がなかったり、プロパティに異なる値を設定しても、
》 結果が同じになることもあります。また、有効な範囲を超えた設定を行っても、
》 エラーが発生しないこともあります。ドライバの具体的な情報については、
》 そのメーカーのマニュアルを参照してください。


超初心者  2009-02-02 22:08:31  No: 141398

魔界の仮面弁士さま
丁寧な解説をありがとうごじざいました、
少しずつ、覚えていきます。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加