|
.NET TIPS 時間がかかる処理の進行状況をダイアログで表示するには?デジタルアドバンテージ2004/07/09 |
![]() |
|
|
|
Windowsアプリケーションで時間のかかる処理を行う場合、その処理実行中に何もユーザーに応答がないと、それが本当に実行中なのか、もしくはアプリケーションがハングアップ(フリーズ)してしまったのか、区別が付かないことが多い。
これが5秒程度の短い処理ならば、「TIPS:待機状態のマウス・カーソルを表示するには?」で紹介した「待機カーソル」を表示して、処理実行中であることをユーザーに明示すれば問題ないだろう。しかしそれ以上の長い処理では、いつまで処理が続くのか、いつまで待てばよいのかを明示しないと、「待機カーソル」のままハングアップしてしまったのではと不安になるかもしれない。
このような状況を回避する1つの方法は、進行状況(処理の何%が完了したのか)を表すメーター(ProgressBarコントロール)を使った「進行状況ダイアログ」を表示することだ。そこで本稿では、この進行状況ダイアログの実装方法について紹介する。
進行状況ダイアログ(WaitDialogクラス)の内容
次の画面は、本稿で準備した進行状況ダイアログである。
![]() |
||||||||||||||||||
| 進行状況ダイアログ | ||||||||||||||||||
| メッセージ・テキストとメーター(ProgressBarコントロール)によって、時間がかかる処理の進行状況を明示するダイアログ。処理が開始されると自動的に表示され、処理が完了すると自動的に閉じられる。 | ||||||||||||||||||
|
本稿では、この進行状況ダイアログを、WindowsフォームであるFormクラスを継承した「WaitDialogクラス」として実装した。WaitDialogクラスのソース・コードは以下からダウンロードできる。
WaitDialogクラスでは、継承元のFormクラス(System.Windows.Forms名前空間)のメンバに加えて、さらに次の表にあるメンバを追加している。
| 【パブリック・プロパティ】 | |
| IsAborting | 処理がキャンセル(中止)されているかどうか(上掲画面の [VB.NET]Public ReadOnly Property IsAborting() As Boolean [C#]public bool IsAborting {get;} |
| MainMsg | メイン・メッセージ(上掲画面の [VB.NET]Public WriteOnly Property MainMsg () As String [C#]public string MainMsg {set;} |
| SubMsg | サブ・メッセージ(上掲画面の [VB.NET]Public WriteOnly Property SubMsg () As String [C#]public string SubMsg {set;} |
| ProgressMsg | 進行状況メッセージ(上掲画面の [VB.NET]Public WriteOnly Property ProgressMsg () As String [C#]public string ProgressMsg {set;} |
| ProgressValue | 進行状況メーターの現在位置(上掲画面の [VB.NET]Public WriteOnly Property ProgressValue () As Integer [C#]public int ProgressValue {set;} |
| ProgressMax | 進行状況メーターの範囲の最大値(上掲画面の [VB.NET]Public WriteOnly Property ProgressMax () As Integer [C#]public int ProgressMax {set;} |
| ProgressMin | 進行状況メーターの範囲の最小値(上掲画面の [VB.NET]Public WriteOnly Property ProgressMin () As Integer [C#]public int ProgressMin {set;} |
| ProgressStep | PerformStepメソッドを呼び出したときに、進行状況メーターの現在位置を進める量を設定する。既定値は「10」 [VB.NET]Public WriteOnly Property ProgressStep () As Integer [C#]public int ProgressStep {set;} |
| 【パブリック・メソッド】 | |
| PerformStep | 進行状況メーターの現在位置をProgressStepプロパティの量だけ進める [VB.NET]Public Sub PerformStep() [C#]public void PerformStep(); |
| WaitDialogクラスで独自に追加したメンバ | |
このWaitDialogクラスでは、進行状況ダイアログを表示するのにShowメソッドを使い、表示したダイアログはCloseメソッドで閉じるという仕様になっている。逆に、FormクラスのShowDialogメソッドによるダイアログの表示を禁止しているので注意してほしい。
このような仕様になっているのは、進行状況ダイアログをモードレス・モードで使用するためである。なお、モードレス・ダイアログについては、「TIPS:モーダル・ダイアログやモードレス・ダイアログを表示するには?」で詳説しているので、詳しくはそちらを参照してほしい。
進行状況ダイアログ(WaitDialogクラス)の使い方
それでは、この進行状況ダイアログ(WaitDialogクラス)を使用するサンプル・コードを以下に示す。
|
|
| 進行状況ダイアログ(WaitDialogクラス)を使用するサンプル・コード(C#) | |
|
|
| 進行状況ダイアログ(WaitDialogクラス)を使用するサンプル・コード(VB.NET) | |
上記のコードの概要を簡単に説明しておく(コードの詳細な解説は割愛させていただく)。
まず、WaitDialogクラスのインスタンスを生成して、ダイアログのオーナー(所有者)となる自分自身(メインのフォーム)をOwnerプロパティに設定している。さらに、進行状況ダイアログを初期化するため、前述したMainMsgプロパティ、ProgressMaxプロパティ、ProgressMinプロパティ、ProgressStepプロパティ、ProgressValueプロパティを設定している。
次に、フォームのEnabledプロパティをfalseに設定してフォーム全体を無効化したうえで、WaitDialogオブジェクトのShowメソッドを呼び出し、進行状況ダイアログを表示している。
その後、(ダイアログが表示されたままの状態で)「時間のかかる処理」を実行している。処理の実行状況をダイアログ上に表示するために、前述したSubMsgプロパティ、ProgressMsgプロパティにメッセージ・テキストを設定することで進行状況メッセージを更新し、PerformStepメソッドを呼び出すことで進行状況メーターを進めている。
なお、「時間のかかる処理」の中にあるApplication.DoEventsメソッドの呼び出しは、ダイアログの表示内容を描画更新するためのものである。詳しくは、「TIPS:時間がかかる処理での「応答なし」を回避するには?」を参照していただきたい。また、DoSomeWorkメソッドは、「時間のかかる処理」を行うメソッドで、このサンプル・プログラムでは単にスリープしているだけである。
「時間のかかる処理」が終了すると、進行状況に関する最終的なメッセージや進行状況メーター(「100%で完了」、もしくは「50%で中断」など)を表示更新している。その際、Threadクラス(System.Threading名前空間)のSleepメソッドにより、進行状況ダイアログのクローズを少し(100ミリ秒間)遅らせている。
最後に、フォームのActivateメソッドを呼び出してアクティブ化したうえで、WaitDialogオブジェクトのCloseメソッドを呼び出して進行状況ダイアログを閉じ、Enabledプロパティをtrueに再設定することにより、無効化しておいたフォームを再び有効に戻している。![]()
| カテゴリ:Windowsフォーム 処理対象:ダイアログ・ボックス 使用ライブラリ:Formクラス(System.Windows.Forms名前空間) 使用ライブラリ:Threadクラス(System.Threading名前空間) 関連TIPS:待機状態のマウス・カーソルを表示するには? 関連TIPS:時間がかかる処理での「応答なし」を回避するには? |
|
||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -



