tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルループ途中で終了できない
記事No11510
投稿日: 2008/02/22(Fri) 11:31
投稿者Kero
クリックするたびにforループが進むプログラムにおいて
ループが終了しないうちに
(画面右上の)x印で終了すると、画面は消えます。
しかしVBの■(終了)ボタンはまだ点灯しています。
そして■を押すと(完全に)終了します。

これはしかたないことなのでしょうか?

x印、一発で完全に終了する方法がありましたら教えてください。

[ツリー表示へ]
タイトルRe: ループ途中で終了できない
記事No11513
投稿日: 2008/02/22(Fri) 13:54
投稿者花ちゃん
> これはしかたないことなのでしょうか?

プログラムの実行中に強制的に閉じた(止めた)ので、メモリ等の解放が行われずに、
Unload イベントが完了しないようです。
これは、EXE にしても同じで、タスクマネージャで見ればプログラムが残ったまま
になっている事で解ります。

> x印、一発で完全に終了する方法がありましたら教えてください。

下記のように End ステートメントを使って、強制的に変数をクリアすれば終了はします。
End ステートメントを使用するとそれ以降の処理はなされませんし、最近では、
End ステートメントを使用するようなプログラムは好まれません。

Private Sub Form_Unload(Cancel As Integer)
   End
End Sub

又は、閉じる ボタンを無効化して閉じるボタンから終了できないようにするとか、
処理中は、フラグを立てておき、QueryUnload イベントで、フラグが立っていれば、
終了処理をキャンセルする等で回避するようにすべきでしょうね。

[ツリー表示へ]
タイトルRe^2: ループ途中で終了できない
記事No11514
投稿日: 2008/02/22(Fri) 14:28
投稿者Kero

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

>
> 下記のように End ステートメントを使って、強制的に変数をクリアすれば終了はします。
> End ステートメントを使用するとそれ以降の処理はなされませんし、最近では、
> End ステートメントを使用するようなプログラムは好まれません。
>
Private Sub Form_Unload(Cancel As Integer)
  xxxxx   '---終了前の処理    
    End
End Sub
としたら完全に終了しました。

[ツリー表示へ]
タイトルRe^3: ループ途中で終了できない
記事No11515
投稿日: 2008/02/22(Fri) 14:32
投稿者花ちゃん
>  Private Sub Form_Unload(Cancel As Integer)
>   xxxxx   '---終了前の処理    
>     End
>  End Sub
>  としたら完全に終了しました。

ですが、End ステートメントは使用しないようにして下さいね。(問題が色々あるので)
臭いものには蓋をするのではなく、臭いものを出さない、置いておかないような処理
をして下さい。

[ツリー表示へ]
タイトルRe: ループ途中で終了できない
記事No11516
投稿日: 2008/02/22(Fri) 14:40
投稿者魔界の仮面弁士
> クリックするたびにforループが進むプログラムにおいて
> ループが終了しないうちに
> (画面右上の)x印で終了すると、画面は消えます。
> しかしVBの■(終了)ボタンはまだ点灯しています。
> そして■を押すと(完全に)終了します。

ループ中で、フォームのプロパティやコントロールなどにアクセスしていませんか?
もしそうであれば、アンロードされていたフォームが再ロードされている可能性があります。
(しかも、非表示なフォームとして)


> これはしかたないことなのでしょうか?

このようなコードでテストしてみたところ、即座に終了しました。

Option Explicit
Private IsLoaded As Boolean
Private Sub Form_Load()
    IsLoaded = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
    IsLoaded = False
End Sub

Private Sub Command1_Click()
    Command1.Enabled = False
    Dim F As Integer
    F = FreeFile()
    Open "C:\a.txt" For Output As #F
    Dim N As Long
    Do While IsLoaded
        N = N + 1
        If N Mod 500 = 0 Then
            Print #F, N
        End If
        DoEvents
    Loop
    Print #F, "終わり!";
    Close #F
End Sub

[ツリー表示へ]