none
ToolStrip上のボタンをクリックしても反応しないことがある RRS feed

  • 質問

  •  Windows Formで開発しています。ToolStrip上のボタンをクリックしても反応しないことがありました。

     元のフォームForm1から別のフォームForm2に遷移した後、Form2を閉じてForm1(※)に戻ったときに、ToolStrip上のボタンをクリックしても反応しなくなります。もう一度クリックすると正常動作してくれます。Form2には「実行」「取消」のボタンがあり「実行」ではデータベースへの保存処理を行った後閉じます。「取消」では何もしないで閉じます。「取消」を押して戻っても現象は起こらず。「実行」を押したときに現象が再現することがあります。どのような場合に現象が起こるかつかめていない状態なのですが、同様の現象に遭遇された方はおられませんか。

     VB2005で開発しています。

     

    ※)別のフォームからForm1に訂正

    2008年3月26日 2:41

回答

  • 三輪の牛 さん、こんにちは

    ダッチです。

     

    ちょっと状況が読み取れなかったのですが、ToolStrip はどのフォームに配置されているのでしょうか?

     

    例えば Form1 だとして、Form2 を閉じた時に Form1 はアクティブな状態になっていますでしょうか。

    ToolStrip 上のボタンなどはそのフォームがアクティブになっていないと反応しません。

    なので単にフォームがアクティブになっていないだけなのではないかと思います。

     

    フォームがアクティブになっているか確認してみてください。

    2008年3月26日 14:07
  • ToolStripはフォームがアクティブではない場合、フォームがアクティブになるだけでクリックは発生しません。

    ダッチさんの言われるようにフォームがアクティブでない可能性があります。

     

    で、プロシージャの実行中はウィンドウメッセージがバッファされEnd Sub脱出時に一気に処理されます。

    実行ボタンの最後に到達するまでの間にそのフォーム内のフォーカスに副作用が出るような処理がある可能性が予想されます。

    そしてそれによりバッファされたメッセージとフォームを閉じようとするメッセージがOS負荷や他のアプリウィンドウの介入などにより

    ごっちゃになり?そのようなことが起きるのではないかと思います。

    そうでなければ、データベースアクセスが瞬間的にCPU100%になりそれが絡んでそうなるとかという予想も。

     

    一番あり得そうなことということで。

    2008年3月26日 14:41

すべての返信

  • 三輪の牛 さん、こんにちは

    ダッチです。

     

    ちょっと状況が読み取れなかったのですが、ToolStrip はどのフォームに配置されているのでしょうか?

     

    例えば Form1 だとして、Form2 を閉じた時に Form1 はアクティブな状態になっていますでしょうか。

    ToolStrip 上のボタンなどはそのフォームがアクティブになっていないと反応しません。

    なので単にフォームがアクティブになっていないだけなのではないかと思います。

     

    フォームがアクティブになっているか確認してみてください。

    2008年3月26日 14:07
  • ToolStripはフォームがアクティブではない場合、フォームがアクティブになるだけでクリックは発生しません。

    ダッチさんの言われるようにフォームがアクティブでない可能性があります。

     

    で、プロシージャの実行中はウィンドウメッセージがバッファされEnd Sub脱出時に一気に処理されます。

    実行ボタンの最後に到達するまでの間にそのフォーム内のフォーカスに副作用が出るような処理がある可能性が予想されます。

    そしてそれによりバッファされたメッセージとフォームを閉じようとするメッセージがOS負荷や他のアプリウィンドウの介入などにより

    ごっちゃになり?そのようなことが起きるのではないかと思います。

    そうでなければ、データベースアクセスが瞬間的にCPU100%になりそれが絡んでそうなるとかという予想も。

     

    一番あり得そうなことということで。

    2008年3月26日 14:41
  • たとえば、Me.CloseのあとのステップでControl.Focusが実行されるパターンとか。
    2008年3月26日 14:44
  •  ダッチさん、まどかさんありがとうございます。

     状況はダッチさんが把握されているとおりです。

     フォームがアクティブになっていませんでした。非アクティブでも反応したり反応しなかったりしますが、アクティブにする方法を探した方が良さそうなのでその方向で検証してみます。Control.Focusしているかどうかも調べてみます。

    2008年3月26日 15:50
  •  何をしたらForm1に戻ったときにアクティブにならないか特定できました。Form2で私家版コンボボックスを使っていてDropDownしたときにForm2が非アクティブになります。一度でもDropDownした後Form1に戻ると現象が起こるようです。データベースアクセスは関係ないようでした。
     NetFrameworkのComboBoxはそのようなことが起きないので私家版コンボボックスのDropDownを実現する方法が悪いらしいと推定できました。おかげさまで一歩前進しました。ありがとうございました。

    2008年3月26日 23:04