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/jaVisual 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は今度から気をつけよう。