いつもお世話になっております。
今回はVB6での印刷について教えて頂けないでしょうか。
印刷コモンダイアログで用紙サイズと印刷方向を設定し、ダイアログを閉じた後に
Printer.PaperSize
Printer.Orientation
の値を確認してみました。
ところが、私がいつも使っているXPマシンでは用紙サイズがまったく変化せず、印刷方向のみ変化します。
おかしいなと思い、今はあまり使っていない98マシンで同じコードを実行させたら、ちゃんと値が変化しました。
XPマシンに何か問題があるのかなと思って、私の持っているAPI関数の本を参考に、GetPrinter関数で通常使うプリンタを確認してみると、2つあるプリンタドライバのどちらも「指定されていない」となっています。それではということで、今度はSetPrinter関数でどちらかを「通常使うプリンタ」に設定しようとすると、どちらも「アクセスが拒否」されるようなんです。
(98マシンではSetPrinter関数で正常に設定ができるようです)
一体何か原因なんでしょうか?
ただ、印刷ダイアログで
CommonDialog1.PrinterDefault = True
と設定した場合、再度ダイアログを開くと以前選択したプリンタがきちんと認識されています。
何か解決の手がかりになるようなヒントを頂ければありがたいのですが。。。
いろいろ調べましたら、WriteProfileStringを使うと通常使用するプリンタの変更は可能なことがわかりした。
で、一番肝心なお聞きしたいところなのですが、
With CommonDialog1
.PrinterDefault = True
.ShowPrinter
End With
のようにしてコモンダイアログを開き、用紙のサイズを変更するのですが、Printer.PaperSize の値が全く変わってくれません。
また、Printer.Orientation では
Printer.Orientation = CommonDialog1.Orientation
とすると、変更した値は取得できますが、98マシンではこのようなことをしなくても、Printer.Orientation の値を取得できます。
これは一体何故なんでしょうか??
すみません。
基本的に、
With CommonDialog1
.PrinterDefault = True
.ShowPrinter
End With
として印刷ダイアログをオープンすれば、XPであっても他のOSであっても、Printer.PaperSize やPrinter.Orientation というのは簡単に取得
できるんでしょうか。
私のマシンだけの問題なのかさえわからない状態なので、解決のための
なんらかの指針だけでも頂けるとありがたいんですけど、無理でしょうか。
どうかよろしくお願い致します。
とりあえず、過去ログ検索『PaperSize』はしましたか?
http://madia.world.coocan.jp/vb/vb_bbs/200403_04030078.html
とかが引っ掛かりますが…。
それで解決するかどうかは分かりません。ドライバが対応してない
用紙サイズを設定してて変更できないとかいう過去ログもありました。
隣りの初心者掲示板でも同じキーワードで過去ログ検索してみて下さい。
今回は関係ないかもしれませんが、マイクロソフトの情報もチェックする必要があります。
例えば
[[VB] Visual Basic 6.0 における印刷関連の制限事項および注意点]
http://support.microsoft.com/default.aspx?scid=kb;ja;JP412851
特攻隊長まるるうさん、本当にありがとうございます。
過去ログは「印刷」とか「印刷ダイアログ」で一応確認はしたんですが、
いまいち解決に至りませんでした。検索の仕方が下手なのかな?
過去ログに、Win98だとOKなのにXPでは印刷ダイアログでのOrientationや
PaperSizeが取得できないという、今回の質問と同内容のものがありましたが、
PaperSizeまで解決したようではなさそうでした。
で、再度入念に過去ログを読んでみましたところ、
MSのサポートページの
http://support.microsoft.com/default.aspx?scid=kb;ja;173981&Product=vbJPN#kb1
「異なるプラットフォーム間での [印刷] ダイアログ ボックスの動作の相違点」という
ページが紹介されていましたので読み進めてみると、
「このダイアログ ボックスの上記以外の情報が必要な場合、[印刷]
ダイアログ ボックスの API (アプリケーション プログラミング イ
ンターフェイス) 関数 (PrintDlg 関数または PageSetupDlg 関数の
いずれか) を使用する必要があります。これらの関数は、プリンタ
プロパティにアクセスし、プロパティを変更します。Visual Basic 6.0
における構造体の配置に関する問題のため、[印刷] ダイアログ ボックス
の関数を直接呼び出すと、必要以上に複雑になります。したがって、
マイクロソフトではこれらの関数を C 言語で作成した DLL から呼び出す
ことを推奨します。」
とありました。また別の過去の記事中に
http://210.233.22.220/VBlabo/commonDLG/J042959.htm
が紹介されており、こちらのコードで試してみましたら今回の問題点が
ようやく解決できました!
どうもありがとうございました。
ツイート | ![]() |