メニュー画面→印刷指示画面→ActiveReportで印刷
というプログラムを作ったのですが、印刷指示画面で印刷ボタンをclickすると印刷後、formcloseイベントが実行され印刷指示画面も終了してしまってメニュー画面に戻ってしまいます。
ヘルプも見ているのですが、探し方が悪いのか原因がわかりません。
お知恵をかしてください。
【メニュー画面】
Private Sub cmdF3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdF3.Click
Me.Hide()
印刷指示画面.ShowDialog()
Me.Show()
End Sub
【印刷指示画面】
Private Sub cmdF5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdF5.Click
Me.Hide()
'== 直接印刷
rpt.Document.Printer.PrinterSettings.Copies = Val(Me.txt枚数.Text)
rpt.Document.Print(False, True, False)
Me.Show()
End Sub
とりあえず、[VB.NET2003 WinXp(Sp2)]で再現しませんでした。
ShowDialog ということは、いわゆるモーダルダイアログ表示なわけですが、
これは表示したフォームが非表示になるまで、呼び出し側の処理を止める。。。
裏を返せばモーダル表示のフォームが非表示になると、呼び出し側の ShowDialog
以降の処理が走ってしまう可能性があるので、あまり良いプログラムとは
言えませんね。
ただ、1つの関数内で Show() してるからうまくいく場合もあるかなぁ。。。
といった印象です。
また、ヘルプ(MSDN)を読むと
[Form.ShowDialog メソッド]
http://msdn2.microsoft.com/ja-jp/library/c7ykbedk(VS.80).aspx
>DialogResult プロパティの値を設定した場合には、Close メソッドは
> .NET Framework によって呼び出されません。その場合はフォームが
>非表示になるだけで
ですから
>formcloseイベントが実行され
は、おかしいかもしれません。DialogResult を設定されていないという場合を
考え、[VB.NET2003]でテストしましたが、Cancel が設定されており、非表示に
なってもインスタンスは残り続けました。
まずは、新規プロジェクトでテストコードを実行し、再現するか確認してください。
再現するようなら、
『印刷指示画面』が変数で宣言されていないようなので、[VB2005]でフォーム名を
直接使っているのでしょうか?。参照変数を用意して、インスタンスを明示的に
生成するようなコードでテストしてみては?