- ベストアンサー
ループ中にフォームを閉じると例外が発生する問題の解決方法
- VB2005でフォームが一枚だけのシンプルなプログラムを作成しています。
- For~Nextのループ内でApplication.DoEvents()を使用して他の操作を受けられるようにしていますが、ループ中にフォームを閉じると異常終了してしまいます。
- 例外の内容はAccess.Violation.Exceptionです。フラグを使用してループを制御する方法を試しましたが効果はありませんでした。効果的なフォームの閉じ方を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ん~ あんまり Endステートメントお勧めしません 本来なら Closeメソッドなどを呼び出して正規の手順を踏むようにしましょう Endステートメント使ったのは今回のような単純テストの場合や強制終了が必要な場合に限ったほうが良いように思います MSDNのEndステートメント辺りを参照してみてください
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
VB.NET2005の WindowsFormアプリケーションなら Closingイベントではなく FormClosingを使ったほうがいいかもしれません Closingイベントでフラグを立てる際に 引数の e.CancelをTrueに設定しないと終了処理が続行されてしまいます FormCloaingイベントで if ランニングフラグ=True then e.Cancel = True ランニングフラグ = False end if といった具合にします イベントの方では ランニングフラグ = true for i as integer= 0 to 100000 Application.DoEvents() if ランニングフラグ = False then exit for end if next if ランニングフラグ = False then End end if といった具合でしょう
お礼
ご回答ありがとうございます。 redfox63さんが教えてくださった方法で思うように終了できるようになりました。が、ちょっと疑問が沸きました。 さっきまでは、いろいろ試行錯誤してとりあえずDisposedイベントにEndと書いて無事終了させることができていました。 redfox63さんが教えてくださったように最後にEndで終了させるということは、ループからわざわざ抜け出すまでもなく、Exit ForをEndに書き換えてしまったり、あるいはClosingのところで直接Endではいけないのでしょうか。 また、現在テキトウにやったようにDisposedイベントのところでEndとするほうが、Closing以降の目に見えないイベントを飛ばさなくて済むので安心な気がするのですが、なにぶん初心者のため自信がありません。 実用上は例外も発生せず、無事終了できるようになったのですが、もう少しアドバイス頂けないでしょうか。 恐れ入りますが、よろしくお願いいたしますm(_ _)m
vb6ですが、フラッグを立てての終了処理はできました。 Dim x As Integer Private Sub Form_Load() x = 0 Do DoEvents If x = 1 Then Exit Do Loop x = 2 Unload Me End Sub Private Sub Form_Unload(Cancel As Integer) If x <> 2 Then x = 1 Cancel = True End If End Sub
補足
ご返信ありがとうございます。 書いていただいたものを元にまっさらな新規プログラムでやってみたのですが、やはりダメでした。 VB2005にはUnLoadメソッドもUnLoadイベントも無いため、代わりにClosedイベント、Closingイベント、Disposeイベントでフラグを立ててみましたが、やはり終了しませんでした。「NullReferenceExceptionはハンドルされませんでした。」だそうです。 しかしボタンなどでフラグを立てて、ループを抜け出してから終了するとあっさり終了するのですが・・・。
お礼
お返事遅れてすみません。 MSDN、説明がまだ難しくて敬遠していたのですが、 大変参考になりました。 やはり参照するのは大切ですね。 どうもありがとうございました。