C# or VB プログレスバー

このQ&Aのポイント
  • C#またはVBでプログレスバーを使用して進行状況を表示する方法について
  • どのようにしてC#またはVBでプログレスバーを使用して進行状況を表示するか調べています
  • プログレスバーを表示させる際に発生する例外の対処法について
回答を見る
  • ベストアンサー

C# or VB プログレスバー

プログレスバーで進行状況を表示する処理を入れています。 http://dobon.net/vb/dotnet/programing/progressdialog.html 上記のサイトをパクってとりあえず作ってみました。きちんとできているのですが 1つだけ問題があって try { ProgressDialog pd = new ProgressDialog(); //ダイアログのタイトルを設定 pd.Title = "カウントアップ"; //プログレスバーの最小値を設定 pd.Minimum = 0; //プログレスバーの最大値を設定 pd.Maximum = 10; //プログレスバーの初期値を設定 pd.Value = 0; //進行状況ダイアログを表示する pd.Show(this); //処理を開始 for (int i = 1; i <= 10; i++) { //プログレスバーの値を変更する pd.Value = i; //メッセージを変更する pd.Message = i.ToString() + "番目を処理中..."; //キャンセルされた時はループを抜ける if (pd.Canceled) break; //1秒間待機する(本来なら何らかの処理を行う) System.Threading.Thread.Sleep(1000); } //ダイアログを閉じる pd.Close(); } catch { MessageBox.Show("error"); } こんな感じで使い、プログレスバー表示中に例外が走るとMessageBoxがモーダレスで 表示されてしまいます。プログレスバー表示前だとモーダルのままです。 色々調べたところ原因は裏でスレッドが走っているからだと思います。たぶん・・ ところが対処法となると少々困っています。モーダルでMessageBoxを表示させたいのですが どうすればよいのでしょうか?教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

第一引数で親ウィンドウのオブジェクトを指定できるメソッドを使って MessageBox.Show(this, "error"); とか。

dodoemon
質問者

お礼

ありがとうございました。わかりやすかったです。

その他の回答 (2)

回答No.3

プログレスバーのフォーム ( ProgressForm ) に対してモーダルにするなら、 class ProgressDialog に public ProgressForm Form { get { return form; } } を追加 ProgressDialog を呼び出す側の Form に delegate void ShowMessageBoxDelegate(); void ShowMessageBox() { MessageBox.Show("error"); } を追加 ProgressDialog pd = new ProgressDialog(); を try の前に出して ProgressDialog pd = new ProgressDialog(); try { ・・・ } とし、 catch { ShowMessageBoxDelegate smb = new ShowMessageBoxDelegate(ShowMessageBox); pd.Form.Invoke(smb); pd.Close(); } のようにすればいいと思います。

dodoemon
質問者

お礼

ありがとうございました。

回答No.1

こんばんは。 vbSystemModal とかね・・・。

関連するQ&A

  • C#のフォームについて

    http://dobon.net/vb/dotnet/programing/progressdialog.html 上記のサイトを元にプログラムを作成したのですがうまくいきません。 ProgressDialog pd = new ProgressDialog(); //ダイアログのタイトルを設定 pd.Title = "カウントアップ"; //プログレスバーの最小値を設定 pd.Minimum = 0; //プログレスバーの最大値を設定 pd.Maximum = 10; //プログレスバーの初期値を設定 pd.Value = 0; //進行状況ダイアログを表示する pd.Show(this); //処理を開始 for (int i = 1; i <= 10; i++) { //プログレスバーの値を変更する pd.Value = i; //メッセージを変更する pd.Message = i.ToString() + "番目を処理中..."; //キャンセルされた時はループを抜ける if (pd.Canceled) break; //時間のかかる処理 //時間のかかる処理 //時間のかかる処理 } //ダイアログを閉じる pd.Close(); 上記のコードの場合、ループ毎の最初にキャンセルかどうかの条件が書かれているため、ループ処理の途中にキャンセルを押してもきかない時があります。 処理中は常にキャンセルかを監視し、押されたらすぐにキャンセルできるようにしたいのですが、どのようにしたらいいのでしょうか。

  • [C#.net]スレッド化された別フォームのプログレスバーの操作方法について

    こんちは。最近C#をやり始めて行き詰まったので質問致します。 質問内容に対する答えをお持ちの方がいらっしゃいましたら、お暇な時にでもお答えください。 public Class SumLoop { public Keisan(int Cnt, string Msg) {   // (1)プログレスバーのフォーム生成時に変数Cntをプログレスバーの最大値、変数Msgをフォームのタイトルに設定したい。   FormProgress FrmPro = new FormProgress();  Thread thread = new Thread(new ThreadStart((2)) );   thread.Start();   for(int i=0; i<Cnt; i++) {   // (3)このiがインクリメントする度にプログレスバーのValueを増やしたい   // FrmPro.SetProgressValue(i) // これだとコンパイラに怒られた    // ここに主な処理   } } public partial class FormProgress : System.Windows.Forms.Form {  public FormDfmProgress() { InitializeComponent(); }  // (3)これではダメみたい  public void SetprogressValue(int iValue) {   progressBar1.Value = iValue;   progressBar1.Refresh();  }  // (4)他のイベントが必要? } ざっと汚いコードを書きましたが具体的にお知恵を貸して頂きたいところは (1)のフォーム生成時のパラメータをどう与えるのか? インスタンス作成の際にここで言うFormDfmProgressをthisで継承させオーバーロードさせれば良いんでしょうか? (2)プログレスバーのフォームを表示させたいだけなのですが、.ShowDialog()では怒られ、.Showでは即座にフォームが消えたりでどうにもなりません。スレッドが消えるまで表示させるにはどうしたらいいでしょう? (3)フォーム側のプログレスバーのValueなり、変数なりをスレッド稼動中に更新させるにはどうしたらいいでしょうか? (4)は、大して気にしていないのですが、これが致命的に足りない!とかいうのがあればご指導願います。 以上長々となりましたが、お暇な方お力を御貸しください

  • プログレスバーでの経過状況表示

    vb.netでのtimerのようなものをやりたくてvbaでプログレスバーを使用して経過状況を表示するプログラムを作りました。プログレスバー自体での視覚的な経過状況表示はできたのですが、現在のパーセンテージをlabelに表示することができません。 Private Sub CommandButton4_Click() Dim i As Long Application.Visible = False i = 1 For i = i To 1000000 UserForm1.ProgressBar1.Value = i / 1000000*100 UserForm1.Label1.Caption =UserForm1.ProgressBar1.Value i = i + 1E-44 Next Application.Visible = True End Sub 上記のようにするとプログラム終了時にlabel1に現在のプログレスバーの値が表示されますが、進行中には表示されないのです。これを進行中も表示させるにはどうしたら良いのでしょうか?

  • プログレスバーの表示方法

    VB6.0 SP5 WINDOWS2000 で開発しています。 処理中のフォームをEnabled=Falseにして、 プログレスバーだけを別のフォームに表示させて、 処理中はプログレスバーのValueをどんどん増やす。 終わるとプログレスバーのフォームを閉じて、 処理してたフォームをEnabled=Trueにしるのですが、 プログレスバーを表示させてるフォームが、変なんです。 プログレスバーが増えている状態の時、 そのフォームが透けてるような、後ろのフォームとまざってるような、 そんな感じになるんです。 これをきれいに表示させたいのですが、何か良い方法はないものでしょうか?

  • プログレスバーについて

    サーバー上からファイルをダウンロードするアプリを 作成しているものです。 ClassAとClassBが存在するとして、 ClassAでファイルをダウンロードする処理を記述し、 ClassBでプログレスバーを含むダイアログを作成しています。 ClassAのファイル読み込みのループ処理のカウンターを プログレスバーのメンバー変数m_plgと同調させたい。 例 ClassA  for(i=0;i<count;i++){  } ClassB  m_plg.SetRange(0,count); m_plg.SetPos(i); かなり簡略化してます。 上記内容は実現可能だと思うのですが、メンバー変数の宣言部がおかしいのか m_plgは宣言されていませんとエラーがでます。 メンバー変数の理解不足だと思うのですが、このような処理を行いたい場合は どちらのClassにも認識されるようなコントロールのメンバー変数はどのようにして 宣言すればよろしいのでしょうか? 開発環境はVC++6.0 MFC ダイアログです。

  • MFCを使わないで、プログレスバーを表示したい。

    複数のファイルで構成されているフォルダがあって、そのフォルダのコピーを作成する処理を行うとします。 その処理の進行状況を、ダイアログボックス上に貼り付けたプログレスバーコントロールで表示したい と思っているのですが、MFCを使用しない例はネットなどで検索しても見つけることができません。 例えば、フォルダの容量の「現在○○%コピーしました。」とか、それが無理なら全体の何ファイル目を処理 しているかなどを、プログレスバーで表示することは可能ですか。 数値的な表示が無理なら、現在処理中かどうかを表示するだけでも構いません。 ご教授の程、よろしくお願いいたします。 環境:VC++6.0, WIN32 API

  • C# プログレスバーに関すること

    先ほどご質問させて頂いた件で1つ解決していなかったのですが質問のほうを閉じてしまいました. なので,もう一度ご質問させて頂きます. ic += 1; //プログレスバーの設定 //最小値 int minimum = 0; //最大値 int years = iYearE - iYearS; int hours = iHourE-iHourS; int iiMinute = iiMinuteE-iiMinuteS; int Maximun = (years+1) * Maxmonth * Maxday * (hours+1) * (iiMinute+1); progressBar1.Style = ProgressBarStyle.Continuous; progressBar1.Minimum = minimum; progressBar1.Maximum = Maximun; progressBar1.Value = ic; label8.Text = (ic / Maximun)*100 + "%処理中"; if (ic/Maximun==1) { label8.Text = "終了"; 上記の様なプログラムを組んでプログレスバーを表示させているのですが,問題はラベルの中が 変動せずに,プログラスバーがすべてたまるまで0%で,たまった瞬間に100%になってしまいます. どうすればラベルのほうの数値を徐々に大きくしていけるのでしょうか? どなたかご教示お願いたします. }

  • javascriptによるプログレスバーの表示制御

    javascriptで任意の処理を実行中に、HTMLのプログレスバーの表示を制御する方法をご教示ください。 ただし、JQueryなどのライブラリは使わないものとします。 実現したい処理は以下です。 (1):処理開始時にプログレスバーを表示  (HTMLに定義されている<progress>を表示) (2):処理A実行 (3):プログレスバーの進捗を50%に更新 (4):処理B実行 (5):プログレスバーの進捗を100%に更新 (6):処理終了時にプログレスバーを非表示 上記を実現するために、例えば以下のようなコードを書いても、(1)~(6)の全処理が終わった結果が画面に反映されるため、画面上はプログレスバーは表示されません。 <progress id="prog" max="100" value="0" style="display:none">Loading...</progress> <script> //(1):処理開始時にプログレスバーを表示 document.getElementById("prog").style.display = 'block'; //(2):処理A実行(仮の処理としてsleep) Sleep(3); //(3):プログレスバーの進捗を50%に更新 document.getElementById("prog").value = '50'; //(4):処理B実行(仮の処理としてsleep) Sleep(3); //(5):プログレスバーの進捗を100%に更新 document.getElementById("prog").value = '100'; //(6):処理終了時にプログレスバーを非表示 document.getElementById("prog").style.display = 'none'; //Sleepメソッド(テスト用) function Sleep(T){ var d1 = new Date().getTime(); var d2 = new Date().getTime(); while( d2 < d1+1000*T ){ d2=new Date().getTime(); } return; }; </script> プログレスバーの進捗を更新する度に、画面にその内容を反映するにはどのようにしたらよいのでしょうか。

  • Access プログレスバー 画面固まる

    Access 2007 VBA でファイル出力処理が長いため、以下を参考にしてプログレスバーを設置しました。 http://www.moug.net/tech/acvba/0060023.htm 1,000件程度だと進行状況がちゃんと表示されるのですが、10,000件単位になるとAccess自体が応答せず、プログレスバーも途中で止まったまま、だけど処理は裏で動いているようでファイル出力自体は時間はかかりますがちゃんと出力されます。 DBアクセスを含んだファイル出力処理なので、多少時間がかかっているのかと思います。 また、私の技術の低さから処理自体に時間がかかってしまっていることもあると思いますが、私の技術では処理自体を変えて早くするのは限界です。 Access画面が固まらず、リアルタイムでプログレスバーを進行させる手段等ございましたらご教授いただけるとありがたいです。

  • Access2000 CopyFromRecordsetでの出力状態をプログレスバーに反映させたい。

    Access2000のレコードセットをCopyFromRecordsetメソッドを使用してデータ出力させています。 しかし、最近データ量が多くなったため、進行状況をプログレスバーで表示したいと思っています。 画面下のステータスバーに表示されるのではと思ったのですが、 「そんなとこまでうちの社員は見ないだろう」と却下されてしまいました。 通常ならDo~Loop処理などの際にプログレスバーのValue値を変えればいいとおもうのですが、 このような「Accessにおまかせ」状態の時はどのようにすればいいのでしょうか。 となたかご教授ください。よろしくお願いします。

専門家に質問してみよう