電子書籍の厳選無料作品が豊富!

お世話になっております。

VB2005を勉強しております。現在、フォームが一枚だけのシンプルなプログラムを作っています。For~Nextのループ内にApplication.DoEvents()と記述して他の操作を受けられるようにしておりますが、その状態でループ中にフォームを閉じると例外が出てしまいます。それにフォームは消えまても、デバッグ中断ボタンを押すまでプログラム自体はは起動したままです。強制定期にループを破棄する方法をご教授ください。または、ループ中でも正常にプログラムを閉じる方法でも結構です。

ループ内の処理によってエラー内容は違いますが、現在はAccess.Violation.Exceptionという例外がでます。下記のように、なんの処理もしないループを作ってみましたが、やはりこれでも違う例外が出ました。
・その1
For i As Integer = 0 To 1000000000
  Application.DoEvents()
Next

・その2
For i As Integer = 0 To 1000000000
  Application.DoEvents()
  System.Threading.Thread.Sleep(100)
Next

ちなみに、フォームのClosingイベントでフラグを立てて、
For i As Integer = 0 To maxInt
  If flag_closing = True Then
    Exit For
  End If
  Application.DoEvents()
Next
などとやってみましたが効果がありませんでした。
よろしくお願いいたします。

A 回答 (3件)

ん~ あんまり Endステートメントお勧めしません


本来なら Closeメソッドなどを呼び出して正規の手順を踏むようにしましょう

Endステートメント使ったのは今回のような単純テストの場合や強制終了が必要な場合に限ったほうが良いように思います

MSDNのEndステートメント辺りを参照してみてください

参考URL:http://msdn2.microsoft.com/ja-jp/library/0wt87xb …
    • good
    • 0
この回答へのお礼

お返事遅れてすみません。
MSDN、説明がまだ難しくて敬遠していたのですが、
大変参考になりました。

やはり参照するのは大切ですね。
どうもありがとうございました。

お礼日時:2007/11/07 19:00

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

といった具合でしょう
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

redfox63さんが教えてくださった方法で思うように終了できるようになりました。が、ちょっと疑問が沸きました。
さっきまでは、いろいろ試行錯誤してとりあえずDisposedイベントにEndと書いて無事終了させることができていました。

redfox63さんが教えてくださったように最後にEndで終了させるということは、ループからわざわざ抜け出すまでもなく、Exit ForをEndに書き換えてしまったり、あるいはClosingのところで直接Endではいけないのでしょうか。
また、現在テキトウにやったようにDisposedイベントのところでEndとするほうが、Closing以降の目に見えないイベントを飛ばさなくて済むので安心な気がするのですが、なにぶん初心者のため自信がありません。
実用上は例外も発生せず、無事終了できるようになったのですが、もう少しアドバイス頂けないでしょうか。
恐れ入りますが、よろしくお願いいたしますm(_ _)m

お礼日時:2007/11/01 21:54

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はハンドルされませんでした。」だそうです。

しかしボタンなどでフラグを立てて、ループを抜け出してから終了するとあっさり終了するのですが・・・。

補足日時:2007/11/01 20:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!