VB6.0で、Form1のcmdSearchを押下時に、
Form2の処理を呼び、処理が完了したらForm2をアンロードしたいのですが、
'Form1内処理
Private Sub cmdSearch_Click()
Me.cmdSearch.Enabled = False
From2.Show
Unload From2
Me.cmdSearch.Enabled = True
End Sub
'Form2内処理
Private Sub Form_Load()
Call Process1
End Sub
Private Sub Process1()
Debug.Print "処理されました"
End Sub
処理中はコマンドボタンのEnabledをFalseにしているにもかかわらず、
連打してしまうと、Form2の処理が呼ばれているように感じます。
処理が早すぎてそう見えるだけなのかもしれませんが・・・。
そこで、フォームがロードされていたら処理をしないという処理を行いたいのですが、
下手に判定すると、そこでロードイベントが走ってしまうような・・・。
アプリケーションの2重起動防止、
If App.PrevInstance Then
MsgBox "起動済"
End
End If
のようなことってフォームでも可能ですか?
よろしくお願いします。
Unload From2
のあとに
DoEvents
と入れてみてもだめですかね?
> From2.Show
これのせいとか?
まずは、
Form2 が
From2 な所から突っ込むべきでは?(^^;
次に
>Form2の処理を呼び、処理が完了したらForm2をアンロードしたい
> From2.Show
モードレスなんだから、完了を待ってなんかいないのでは?
>処理中はコマンドボタンのEnabledをFalseにしているにもかかわらず、
処理中を待っていないで、ボタン押下の処理が終了するから関係ない。
…ボタンを押されたメッセージの処理は、PGが重い処理を実行してたときに
処理抜けが発生しないように、OSが覚えておいて(キューに溜めて)実行して
くれてるんだから、全く関係ない『期待された結果』に思います。
>処理が早すぎてそう見えるだけなのかもしれませんが・・・。
[VB6.0]
Private Declare Sub Sleep Lib "kernel32" (ByVal sec As Long)
Private Sub Form_Load()
Call Process1
End Sub
Private Sub Process1()
Sleep (1000)
Debug.Print "処理されました" & Now
End Sub
…では、どうでしょうか?
設計から考え直すところだけど、Form2 がロードされていることを
フラグ代わりにして処理したいってことだよね?
Forms コレクションを使えば、アプリケーションにロードされているすべての
フォームを参照することができます。Name プロパティで検索してみるとか。
それ以前にモーダル表示にしてしまえばいいような気も。。。
もしくは、処理が終わったことを知るフラグをちゃんと用意するとか。
返事が遅れてしまい、申し訳ございません。
KG様、通ってみた様、特攻隊長まるるう様、有難うございます。
特攻隊長まるるう様
>Form2 が
>From2 な所から突っ込むべきでは?(^^;
すみません。ここに記述する際にミスしてしまったようです。
Forms コレクションは、初めて知りました。
For i = 0 To Forms.Count -1
If Forms(i).Name = "Form2" Then
Unload Forms(i)
End If
Next i
このような形で記述してみました。
>モードレスなんだから、完了を待ってなんかいないのでは?
>それ以前にモーダル表示にしてしまえばいいような気も。。。
確かに、よくよく考えれば、頭の中で「処理を待つ」と
当然のように決め付けていました。お恥ずかしい。
参考意見有難うございました。
| ツイート |
|