VB6で作成したプロセスが終了できない

(;´д`) まる2日ハマってようやく解決。

状況

  FormA
    +--->FormB
    +--->FormC
    :

上のようにFormAから複数のForm(B/C...)を起動するアプリケーションで、FormBのグリッド内でEnterキーを押したときにFormAにデータを返しFormBを閉じる。

そんなケースで何故かFormAを終了したときプロセスが残ってしまい、多重起動防止機構で「実行中です」と。

ソース

Private Sub fpSList_KeyDown(KeyCode As Integer, Shift As Integer)
On Error GoTo Err_Sub:
    If KeyCode = vbKeyReturn Then
        call fncSetReturnValues '値を返す関数
        Unload Me               'フォームを閉じる
    End If
    If KeyCode = vbKeyUp And fpSList.ActiveRow = 1 Then
        Me.SearchCondition.SetFocus
    End If
Exit_Sub:
    Exit Sub
Err_Sub:
    Call PfncLogWrite("fpSList_KeyDown", Err)
    Resume Exit_Sub
End Sub

KeyDownイベントでEnterキーを拾って、値を返してフォームを閉じる。
うん。特に問題ないな。

( ゚д゚) と、思ったのが大誤算だった

誤算その1:フォームの暗黙的ロード

No.2 回答者:taka_tetsu 回答日時:2003/08/21 15:55

VBで作成したGUIのアプリは、フォームをすべてアンロードすれば終了します。

なので、見えないフォームが残っているんでしょう。
ロードしたフォームをすべてアンロードしていないためです。

自分ではアンロードしたつもりでも、アンロードした後にコントロールのプロパティを見たときに暗黙的にロードされて残ることもあります。
VBプログラムの終了 - Visual Basic - 教えて!goo

(; ゚д゚) 暗黙的ロードだと!?

確かに、アンロードコードの後に

    If KeyCode = vbKeyUp And fpSList.ActiveRow = 1 Then

と、プロパティ触っている部分はある。

( ゚д゚) でもand以前がFalseになるからショートサーキットで右辺は無視だよなぁ。

誤算その2:ショートサーキット不在

で、先日マイクロソフトさんの登録されているMSKBを ぼ〜っと眺めていたら、以下の記事が。

* Visual Basic での "ショートサーキット" 評価の説明
http://support.microsoft.com/kb/817250/ja

Visual Basic 2005 または Visual Basic .NET では、論理 AND 式および論理 OR 式のオペランドは、1 つ目のオペランドの結果に関係なく、2 つ目も評価されます。

...

ただし、Visual Basic 2005 または Visual Basic .NET には、新しい 2 つの演算子 (AndAlso 演算子および OrElse 演算子) があります。これらの演算子を、それぞれ論理 AND 演算子および論理 OR 演算子の代わりに使用できます。これらの演算子を使用すると、Visual Basic .NET で "ショートサーキット" 評価を行うことができます。

[id:Wacky:20071215:1197739589]

(; д )  ⌒Y⌒Y⌒゚ ゚

修正コード

Private Sub fpSList_KeyDown(KeyCode As Integer, Shift As Integer)
On Error GoTo Err_Sub:
    Select Case KeyCode
        Case vbKeyReturn
            call fncSetReturnValues '値を返す関数
            Unload Me               'フォームを閉じる
        Case vbKeyUp
            If fpSList.ActiveRow = 1 Then
                Me.SearchCondition.SetFocus
            End If
    End Select
Exit_Sub:
    Exit Sub
Err_Sub:
    Call PfncLogWrite("fpSList_KeyDown", Err)
    Resume Exit_Sub
End Sub

(; д ) ...いや最初からSelect使えって話なんだけど。

予想を超えたクソ言語だなVB今度から気をつけよう。