- PR -

.NETでの処理中ダイアログ

1
投稿者投稿内容
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2002-09-09 15:01
いつも参考にさせていただいてます。

表題の件ですが、.NETでプログレスバー等を使用した
いわゆる「処理中ダイアログ」を作成するセオリーの
様なものって存在するのでしょうか?

Formのクラスを使用してダイアログを作成すると
Show()メソッドから帰ってくるまで呼び出し側では
ダイアログの内容を変更できませんよねぇ?

ダイアログの中で処理を行おうとすると、処理の開始と
なる適切なイベントを見つけることが出来ません。
(Activateだとちょっと意味が違いますよね?)

これだけの機能を積んでいるのですから、
簡単に出来そうな気もしているのですが、
どうなんでしょう・・・

実は低レベルな問題なのかもしれませんが、
どうぞご容赦の程を・・・
homes
常連さん
会議室デビュー日: 2002/08/06
投稿数: 38
投稿日時: 2002-09-09 15:16
私の場合は例えばプログレスバーの値を変更した後に
System.Windows.Forms.Application.DoEvents()
と書き込んで逃げていますが、
もしかしたらもっと他にも方法があるかもしれません。
回答の意味が違っていたらすみません。
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2002-09-10 09:20
homesさん書き込みありがとうございます。

言葉足らずかもしれません(^^;
たとえば、ファイルを複数コピーする処理Aがあって、
これの途中経過を表示したいダイアログ「dlgTransactionクラス」が
あるとします。
dlgTransactionの中に処理Aを入れた場合、処理をStartさせる
適切なイベントがないような気がしてまして・・・
はたまた、dlgTransactionの外側で処理Aをする場合
dlgTransactionのShowメソッドからリターンしてくるまで
処理を始められないという状況になってしまいますよね?

このあたりのセオリー的な処理はあるのかな?と思った次第です。

でも、homesさんの書き込みを読む限りでは上記の
処理を行うスケルトン的なものが既にあり、
さらにひとつ突っ込んだレベルでの回答の様にお見受け
するのですが・・・前段階でつまずいてるわたしなのです・・(^^;
Masa
会議室デビュー日: 2002/08/13
投稿数: 16
投稿日時: 2002-09-10 09:41
おはようございます。
出水田と申します。

Show()メソッドの後に処理が先に進まないのは、ダイアログが
モーダルウィンドウとして表示されているためです。
モードレスウィンドウとして表示する方法を検索してみては
いかがでしょうか?
homes
常連さん
会議室デビュー日: 2002/08/06
投稿数: 38
投稿日時: 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()

見当違いの回答の際はご容赦下さい。
長文失礼致します。


homes
常連さん
会議室デビュー日: 2002/08/06
投稿数: 38
投稿日時: 2002-09-10 11:42
homesです こんにちわ
ヘルプにありましたので抜粋して載せておきます。

'**** モーダル ダイアログ ボックスとしてフォームを表示するには
'**** ShowDialog メソッドを呼び出します。
'**** ダイアログ ボックスをモーダルで表示する方法の例は、次のとおりです。

Dim frmAbout as New Form()
frmAbout.ShowDialog()


'**** モードレス ダイアログ ボックスとしてフォームを表示するには
'**** Show メソッドを呼び出します。

Dim f As New Form()
f.Show()

'**** フォームがモーダルで表示されている場合、ダイアログ ボックスを閉じるまで、
'**** ShowDialog メソッド以降のコードは実行されません。
'**** 一方、フォームがモードレスで表示されている場合は、
'**** フォームが表示されるとすぐに Show メソッド以降のコードが実行されます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-09-10 13:52
引用:

Mickyさんの書き込み (2002-09-09 15:01) より:
Formのクラスを使用してダイアログを作成すると
Show()メソッドから帰ってくるまで呼び出し側では
ダイアログの内容を変更できませんよねぇ?

ダイアログの中で処理を行おうとすると、処理の開始と
なる適切なイベントを見つけることが出来ません。
(Activateだとちょっと意味が違いますよね?)

これだけの機能を積んでいるのですから、
簡単に出来そうな気もしているのですが、
どうなんでしょう・・・

実は低レベルな問題なのかもしれませんが、
どうぞご容赦の程を・・・



たとえば、
コード:
class ProgressForm inherits System...Form ' 省略しています注意
Friend WithEvent プログレスバー ' フォーム上に配置したらこう宣言されている
public sub プログレスバーを1つ進める
public sub new
    プログレスバーを初期化する
end sub
end class

dim prgFrm as ProgressForm = new ProgressForm()
prgFrm.show
+
|ここで時間のかかる処理
|ただし、メソッドを呼び出して、そこから適宜戻ってくること
|
|ウインドウのイベント処理
|prgFrm.プログレスバーを1つ進める
+


というふうにします。

 ここで問題は「適宜戻ってくること」です。イベント処理を“させなければ”ならないので、例に挙げられているファイルコピーであれば、1つのファイルをコピーしている間は(できないこともないですが)プログレスバーを進めることはできません。ちなみに、Windowsのエクスプローラーでファイルが飛んでいくのは、movieファイルをバックスレッドで実行しているからです。
 もう一つの方法は、処理先のメソッドにイベント処理用のメソッドを渡して呼び出してもらう方法です。コールバックプロシージャが指定できる場合は、それをあてたりします。
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2002-09-11 10:44
Mickyでございます。
みなさま書き込みありがとうございました。

それにしても詳細な解説ほんとに感謝しておりますm(__)m
「モーダルで表示」・・・
言われてみれば、「そうかぁ〜〜そうだよなぁ」と
相変わらずの勉強不足に若干テンション下がったり
しておりますが、それよりも返信いただいたうれしさのほうが
大きいので、いいか・・という感じです(^^;

ありがとうございました。
これからもよろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)