- - PR -
.NETでの処理中ダイアログ
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2002-09-09 15:01
いつも参考にさせていただいてます。
表題の件ですが、.NETでプログレスバー等を使用した いわゆる「処理中ダイアログ」を作成するセオリーの 様なものって存在するのでしょうか? Formのクラスを使用してダイアログを作成すると Show()メソッドから帰ってくるまで呼び出し側では ダイアログの内容を変更できませんよねぇ? ダイアログの中で処理を行おうとすると、処理の開始と なる適切なイベントを見つけることが出来ません。 (Activateだとちょっと意味が違いますよね?) これだけの機能を積んでいるのですから、 簡単に出来そうな気もしているのですが、 どうなんでしょう・・・ 実は低レベルな問題なのかもしれませんが、 どうぞご容赦の程を・・・ | ||||||||
|
投稿日時: 2002-09-09 15:16
私の場合は例えばプログレスバーの値を変更した後に
System.Windows.Forms.Application.DoEvents() と書き込んで逃げていますが、 もしかしたらもっと他にも方法があるかもしれません。 回答の意味が違っていたらすみません。 | ||||||||
|
投稿日時: 2002-09-10 09:20
homesさん書き込みありがとうございます。
言葉足らずかもしれません(^^; たとえば、ファイルを複数コピーする処理Aがあって、 これの途中経過を表示したいダイアログ「dlgTransactionクラス」が あるとします。 dlgTransactionの中に処理Aを入れた場合、処理をStartさせる 適切なイベントがないような気がしてまして・・・ はたまた、dlgTransactionの外側で処理Aをする場合 dlgTransactionのShowメソッドからリターンしてくるまで 処理を始められないという状況になってしまいますよね? このあたりのセオリー的な処理はあるのかな?と思った次第です。 でも、homesさんの書き込みを読む限りでは上記の 処理を行うスケルトン的なものが既にあり、 さらにひとつ突っ込んだレベルでの回答の様にお見受け するのですが・・・前段階でつまずいてるわたしなのです・・(^^; | ||||||||
|
投稿日時: 2002-09-10 09:41
おはようございます。
出水田と申します。 Show()メソッドの後に処理が先に進まないのは、ダイアログが モーダルウィンドウとして表示されているためです。 モードレスウィンドウとして表示する方法を検索してみては いかがでしょうか? | ||||||||
|
投稿日時: 2002-09-10 10:20
Mickyさん こんにちわ
内容的にはコピーの進捗状況をプログレスバー等で表示するといった 事でよろしいでしょうか?解釈が違っていたらすみません。 >このあたりのセオリー的な処理はあるのかな?と思った次第です。 う〜ん、セオリー的な事は分かりませんが、私がいつも使っている方法 は後者の「dlgTransactionの外側で処理Aをする」やり方です。 とりあえず簡単なサンプルでよかったら載せますので活用してみて下さい。 必要なのはとりあえず最初のフォームにはボタンのみを貼り付けて頂いて、 もう一つ「frmProgress」というフォームを作成して下さい。 「frmProgress」の中にはプログレスバーとラベルを3つ貼り付けて下さい。 その後にボタンだけ貼り付けたフォームのButton1_Clickイベントの中に 以下のコードを貼り付けて実行してみて下さい。 Dim frmProg As New frmProgress() 'プログレスバー進捗フォーム Dim ix As Long Const intCount As Integer = 50000 '総件数 '****プログレスバー初期設定 frmProg.Show() With frmProg .Text = "データ処理中:しばらくお待ち下さい" .Label1.Text = intCount & "件" .ProgressBar1.Maximum = intCount .ProgressBar1.Minimum = 0 .ProgressBar1.Step = 1 .ProgressBar1.Value = 0 System.Windows.Forms.Application.DoEvents() End With '*************************** '-----------プログレスバー増加ロジック For ix = 1 To intCount With frmProg .ProgressBar1.Value = ix .Label2.Text = Int(ix / intCount * 100) & "%" .Label3.Text = Int(ix).ToString End With System.Windows.Forms.Application.DoEvents() Next frmProg.Close() 見当違いの回答の際はご容赦下さい。 長文失礼致します。 | ||||||||
|
投稿日時: 2002-09-10 11:42
homesです こんにちわ
ヘルプにありましたので抜粋して載せておきます。 '**** モーダル ダイアログ ボックスとしてフォームを表示するには '**** ShowDialog メソッドを呼び出します。 '**** ダイアログ ボックスをモーダルで表示する方法の例は、次のとおりです。 Dim frmAbout as New Form() frmAbout.ShowDialog() '**** モードレス ダイアログ ボックスとしてフォームを表示するには '**** Show メソッドを呼び出します。 Dim f As New Form() f.Show() '**** フォームがモーダルで表示されている場合、ダイアログ ボックスを閉じるまで、 '**** ShowDialog メソッド以降のコードは実行されません。 '**** 一方、フォームがモードレスで表示されている場合は、 '**** フォームが表示されるとすぐに Show メソッド以降のコードが実行されます。 | ||||||||
|
投稿日時: 2002-09-10 13:52
たとえば、
というふうにします。 ここで問題は「適宜戻ってくること」です。イベント処理を“させなければ”ならないので、例に挙げられているファイルコピーであれば、1つのファイルをコピーしている間は(できないこともないですが)プログレスバーを進めることはできません。ちなみに、Windowsのエクスプローラーでファイルが飛んでいくのは、movieファイルをバックスレッドで実行しているからです。 もう一つの方法は、処理先のメソッドにイベント処理用のメソッドを渡して呼び出してもらう方法です。コールバックプロシージャが指定できる場合は、それをあてたりします。 | ||||||||
|
投稿日時: 2002-09-11 10:44
Mickyでございます。
みなさま書き込みありがとうございました。 それにしても詳細な解説ほんとに感謝しておりますm(__)m 「モーダルで表示」・・・ 言われてみれば、「そうかぁ〜〜そうだよなぁ」と 相変わらずの勉強不足に若干テンション下がったり しておりますが、それよりも返信いただいたうれしさのほうが 大きいので、いいか・・という感じです(^^; ありがとうございました。 これからもよろしくお願いします。 |
1