フォーム上にボタンとMSHFlexGridとコモンダイアログの3つを設置して、
ボタンを押すとMSHFlexGridの内容の印刷を行いたいのです。
ところが、ボタンを押して印刷の設定画面を出した後に印刷を実行すると
何故か2回印刷が始まってしまいます。
これを直すにはどうしたらよいでしょうか?
以下は印刷に関わる部分だと思います。
CommonDialog1.ShowPrinter
Printer.PaintPicture MSHFlexGrid1.Picture, 0, 0
Printer.EndDoc
コモンダイアログや印刷の根本的な使い方と理解があまりないために
とんちんかんな事してる可能性は高いので、おかしなところがあれば
是非ご指摘をお願いします。
まず、これはどこのイベントプロシージャに記述されているので
しょうか? 今回の場合はおそらく違うでしょうが、そのプロシージャ
自体が複数回呼ばれている可能性も排除できませんよね。
で、Common Dialog コントロールによる印刷と、Printerオブジェクト
による印刷は、実際には関係がありません。
Common Dialog コントロールを使う場合は、以下のどれかになるでしょう。
A,1,FlagsプロパティにcdlPDReturnDCを含ませる。
2,印刷には、IPicture.Renderメソッドを用いる。
3,API関数のEndDocを用いて印刷を終了する。
B,1,FlagsプロパティにはcdlPDReturnICを含ませる。
2,API関数を使って、設定すべき情報をhDCプロパティから取得する。
3,Printerオブジェクトの各プロパティに2で得た値を代入する。
4,Printer.PaintPictureメソッドで描画し、EndDocメソッドで終了。
C,1,FlagsプロパティにはDCやICを返させる値を含ませない。
2,Common Dialogの各プロパティから設定すべき値を得て、Printer
オブジェクトの各プロパティに代入する。
3,Printer.PaintPictureメソッドで描画し、EndDocメソッドで終了。
辺りでしょうか。これらのほかに、Common Dialog コントロールを
使わず、独自のダイアログを作って、それの結果をPrinterオブジェクト
に反映させて使う、と言った方法も考えられるでしょう。
え〜とまず、
Private Sub cmdPrint_Click()
'印刷
CommonDialog1.ShowPrinter
Printer.PaintPicture hfgView.Picture, 0, 0
Printer.EndDoc
End Sub
というのが正しい表記でした。
ボタンのクリックイベントに書いてます。
K.J.K.さんの言われる中ではたぶんCのやり方を実行しようとしてるんだと思います。
そして、とりあえず一通り試してみましたがどうもうまくいきませんでした・・・
そこでコモンダイアログを使わず印刷を実行できるボタンを作ろうと思いましたが
それは可能でしょうか?
とりあえず、まず既定のPrinterに出力するだけを考えてみては。
後半2行だけで作動しませんか?
そして、それができるようになったら、今Printerとしているところを、
Printersコレクションの中から該当するものを探し出し、それを
Printer型のオブジェクトに代入して、置き換えて使ってみるコード
にしてみてください。
あ、たしかに後半2行だけの記述に変えたら2回連続印刷になりませんでした。
代わりに設定画面がでなくなってしまいましたが、そっちはこれから
言われました通りにやってみます。
一応一番の問題の2回印刷されるというのは解決しましたので解決といたします。
K.J.K.さんありがとうございました。
ツイート | ![]() |