DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プログレスダイアログのモーダル表示について。

環境/言語:[VB2005]
分類:[.NET]

http://dobon.net/vb/dotnet/programing/progressdialog.html

こちらで公開されているプログレスフォームを参考にさせていただき、
実装しました。
大変助かったのですが、モーダル表示がうまくいかないので、アドバイス
いただけないでしょうか。

具体的には、フォームに配置されているボタンを押すと
プログレスダイアログフォームが表示され、進捗バーが増えていくのですが、
少し時間が経つとモーダルが解除されてしまうのか、フォームにフォーカスを
移せるようになってしまうのです。
試しにこちらで公開されているサンプルそのままで実装し、フォームに
配置されているボタンを押した時にプログレスダイアログフォームが
表示されるようにしてみました。
同様に、最初はモーダルになっているのですが、表示元のフォームの
×ボタンを連打していると、ある程度進捗が進んだところでモーダルが
解除され、表示元フォームにフォーカスできてしまいます。

プログレスダイアログの表示が消えるまで、完全にモーダルとするには
どのように修正、実装すれば良いでしょうか?
表示前に、表示元をEnabled=Falseにしてみたりもしたのですが、変化が
ありません。
自分のレベルでは修正箇所が見つからず、困っています。
アドバイスいただけないでしょうか。

宜しくお願いします。
この投稿はXPまたはVistaを前提としています。

> 同様に、最初はモーダルになっているのですが、表示元のフォームの
> ×ボタンを連打していると、ある程度進捗が進んだところでモーダルが
> 解除され、表示元フォームにフォーカスできてしまいます。
このとき、最大化ボタンが無効状態に変化したり、元のフォームの内容が白くなったりしますか?(いずれかでも両方でも)
または、タイトルバーに「応答なし」とか表示されますか?

#ゴーストウィンドウの可能性を疑ったもの。
OSを書き忘れていました。
ご指摘の通り、WindowxXPです。


>このとき、最大化ボタンが無効状態に変化したり、元のフォームの
>内容が白くなったりしますか?(いずれかでも両方でも)
>または、タイトルバーに「応答なし」とか表示されますか?

はい、元のフォームが白くなったり、「応答なし」が表示されてしまいます。
XPやVistaでは「プログラムのコードが動き続ける状態」、俗に言うビジー状態が長い間続くと、ダミーのフォーム(ゴーストウィンドウ)に置き換えられます。
これが操作可能な形として見えるわけです。
プログラムが異常な状態になっていると判断されていることになります。

正当な解決策としては、重たい処理・長くかかる処理をBackgroundWorker等を使って別のスレッドで実行することです。
DoEventsでそれなりにうまく動くように見えますが、辞めた方が無難です。

この辺はマルチスレッド、ワーカースレッドあたりの語句を絡めて調べてみて下さい。

DOBON.NET | プログラミング道 | プログラミング掲示板