C#プログラミングのic値の加算に関する問題

このQ&Aのポイント
  • C#プログラミングにおいて、ic値の加算がうまくいかず、プログレスバーの動作も正しく表示されません。
  • マクロでのic値の加算と同様の処理をC#で書いたが、プログレスバーが徐々にたまって行かず、処理が終わった時にいきなり100になってしまいます。
  • 解決策を教えていただきたいです。
回答を見る
  • ベストアンサー

C#プログラミング

とても単純な事なのですが,例えばマクロだと ic=0 for j=1 To 100 ic=ic+1 next j という風に組むとicの値が1ずつ加算されていきますが,これをC#で書くと int ic for (j=1;j<=100;j++) { ic+=1; } でいいと思ったのですが,何かうまくいきません. 何がうまくいかないかといううと,プログレスバーが徐々にたまって行かず,処理が終わった 時にいきなり100になってしまいます. 下記にそのプログラムを転記しておきます.どなたかご教授頂けませんか? 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 = "終了"; }

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

  • ベストアンサー
回答No.2

progressBar1.Valueを変えた後に Application.DoEvents(); を入れてみたらどうなりますか。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

確認ですが, 「プログレスバーが徐々にたまって行かず,処理が終わった時にいきなり100になってしまいます」というのは 処理が進んでいてもプログレスバーがまったく進まず, 処理が終わったら突然「みょん」と伸びる ということでいいですか? label8 に出る表示は間違いなく「0% から 100% に突然飛んで『終了』」なんだけど. あと細かいところでは ・Maximun じゃなくて Maximum だよね ・minimum が小文字で Maximun が大文字ってのが微妙 ・Maximun の計算の意味が分からん とかあるけど, とりあえずここでは関係ないだろう.

Ashgin
質問者

補足

認ですが, 「プログレスバーが徐々にたまって行かず,処理が終わった時にいきなり100になってしまいます」というのは 処理が進んでいてもプログレスバーがまったく進まず, 処理が終わったら突然「みょん」と伸びる ということでいいですか? ↑ はい.その通りです.どうすれば良いかご教示願えないでしょうか? label8 に出る表示は間違いなく「0% から 100% に突然飛んで『終了』」なんだけど. ↑ では,このラベルも徐徐に変えていく方法もご教示願えないでしょうか? また,スペルのミスは今回の件に関しては関係ございませんが.ご指摘をありがとうございます.

関連するQ&A

  • 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%になってしまいます. どうすればラベルのほうの数値を徐々に大きくしていけるのでしょうか? どなたかご教示お願いたします. }

  • VBでModule1からForm1のコントロールを操作したい

    VB.NETでForm1のProgressBarをForm1.VBからではなく外部Module1.vbのサブルーチンから操作する方法はありませんか。"Dim Form1 as New Form1"などとするともうひとつフォームが開いたりしてうまくいきません。現在、下記の様にしてもうひとつ別のForm2を開いてプログレスバーを表示しております。 できるなら、Form1だけで済ませたいと思っております。 勉強不足でわかりません。どなたか教えてください。 Form2.Show() Form2.ProgressBar1.Minimum = 0 Form2.ProgressBar1.Maximum = 学習回数 Form2.ProgressBar1.Visible = True For 繰り返し = 1 To 学習回数 Form2.ProgressBar1.Value = 繰り返し Form2.lbl解析中.Text = 繰り返し Form2.Label1.Update() Form2.lbl解析中.Update()      ****処理**** Next

  • C言語初心者です。書いたプログラムを採点して下さい

    入力された0~100までの10個の数値から、 最小値と最大値を表示するプログラムを書きました。 #include <stdio.h> int getmin(int * pvalue); int getmax(int * pvalue); int main(void) {     int i,value[10];     int minimum,maximum;     printf("0~100の範囲で10個の数値を入力してください:\n");     for(i=0;i<10;i++){         scanf("%d",&value[i]);         if(value[i] < 0 || value[i] > 100)         {             printf("0~100の範囲です:\n");             scanf("%d",&value[i]);         }     }     minimum = getmin(value);     maximum = getmax(value);     printf("最小値は%d\n",minimum);     printf("最大値は%d\n",maximum);     return 0; } int getmin(int * pvalue) {     int i=0,j;     for(j=1;j<10;j++)     {         while(pvalue[i] > pvalue[j]){i++;}     }     return pvalue[i]; } int getmax(int * pvalue) {     int i=0,j;     for(j=1;j<10;j++)     {         while(pvalue[i] < pvalue[j]){i++;}     }     return pvalue[i]; } 正常に作動はしましたが、 記述に無駄が多い、分かりづらい などあればご指導いただけますか? よろしくお願いします。

  • 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# 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を表示させたいのですが どうすればよいのでしょうか?教えてください。

  • ループの後にTrueになる不思議

    下記のコードを実行してみます。 Private Sub Command1_Click() ProgressBar1.Visible = True Label1.Visible = True ProgressBar1.Max = Val(Text1.Text) For i = 1 To Val(Text1.Text) Text1.Text = i ProgressBar1.Value = i Next i MsgBox "終了しました。" ProgressBar1.Visible = False Label1.Visible = False End Sub 「ProgressBar1」はループに入る前に「Visible = True」になります。 「Label1」はループ終了後に「Visible = True」になります。 「Text1.Text = i」はループ終了後に表示されます。 本来は、「Label1」はループに入る前に「Visible = True」にして、「Text1.Text = i」をループ中に表示させたいのですが、できません。 どこかコードが間違っているのでしょうか。

  • C# Form処理

    Form1とForm3からForm2を表示させれるようにして,どちらかのフォームのコントロールをクリック したらform2が立ち上がりformに応じた処理を行いたいのですが,下記のコードではエラーとなって 動きません int Pin1 = f1.butt1; int Pin3 = f3.butt3; if (Pin1 == 1) { int h = f1.but; for (int hj = 1; hj < 43; hj++) { if (h == hj) { //Labelに文字を入力。 string Memo = "label" + (hj + 93); string Hd = "label" + (hj + 51); Label f1_Memo = (Label)f1.Controls[Memo]; f1_Memo.Text = this.textBox1.Text; Label f1_Hd = (Label)f1.Controls[Hd]; f1_Hd.Text = this.textBox2.Text; } } } else if (Pin3 == 1) { int h3 = f3.but3; for (int hj3 = 1; hj3 < 43; hj3++) { if (h3 == hj3) { //Labelに文字を入力。 string Memo = "label" + (hj3 + 744); MessageBox.Show(Memo.ToString()); Label f3_Memo = (Label)f3.Controls[Memo]; f3_Memo.Text = this.textBox1.Text; } } } Form1のコントロールであれば上のforループ,Form3であれば下のforループで処理するように考えております.Form1でform3を開くコントロールを選択した場合上記コードのbutt1は0になるように しているつもりです. エラーは NullReferenceExceptionがハンドルされませんでした. オブジェクト インスタンスの作成には new キーワードを使用します。 何がいけなくてどう対処すればよろしいのでしょうか? ご教授よろしくお願いいたします.

  • C#のlabelの表示について

    C#のlabelの表示について カテ違いですが、C#のカテゴリがないのでここで質問させていただきます。 以下の時刻を表示するプログラムを作成したのですが、        //現在の時刻を取得  DateTime dt = DateTime.Now; int Second_1 = dt.Second % 10; int Second_2 = dt.Second / 10; int Minute_1 = dt.Minute % 10; int Minute_2 = dt.Minute / 10; int Hour_1 = dt.Hour % 10; int Hour_2 = dt.Hour / 10; label1.Text = Second_1.ToString(); label2.Text = Second_2.ToString(); label3.Text = Minute_1.ToString(); label4.Text = Minute_2.ToString(); label5.Text = Hour_1.ToString(); label6.Text = Hour_2.ToString(); if (int.Parse(label1.Text) == 0 && int.Parse(label2.Text) == 0) { int a; for (a = 0; a < 10; a++) { pictureBox4.Top += 1; System.Threading.Thread.Sleep(30); } for (a = 0; a < 50; a++) { pictureBox4.Top += 5; System.Threading.Thread.Sleep(10); } pictureBox4.Top = 12; } label1は「秒」の1の位、 label2は「秒」の10の位、 pictureBox4は「分」の1の位の画像を表示しています。 pictureBoxとlabelを重ねて、画像の上に時刻を表示しています。 秒が0になったとき(分の位が一つ上がるとき)、 分の位の画像を移動させて(forループ2つ)再び元の位置に戻しているのですが(pictureBox4.Top = 12;) そのとき秒が「00」とはならず「59」のままで、このループが終わると「00」を飛ばして「01」となります。 ちなみにこの部分はタイマーで0.2秒ごとに回しています。 原因がわかりませんので、ご教授願います。 また、ループには概算で0.8秒かかりますが、この間、タイマーの呼び出しは実行されているのでしょうか? 加えて、pictureBox4.Topの値を動かしていますが、重ねて配置しているlabelも一緒に動いてくれます。 いろいろなサイト様を参考に、 this.label3.Parent = this.pictureBox4; と親コントロールをFormから変更したのですが、このためでしょうか? 変な表現がありましたらご容赦ください。 よろしくお願いします。

  • C# プログラム

    下記のプログラムを組んだのですが,for Dが1回しかまわりません. int[] Mo = new int[12]; #region Month ///<summary> ///月の定義 ///<summary/> Mo[0] = 4; Mo[1] = 5; Mo[2] = 6; Mo[3] = 7; Mo[4] = 8; Mo[5] = 9; Mo[6] = 10; Mo[7] = 11; Mo[8] = 12; Mo[9] = 1; Mo[10] = 2; Mo[11] = 3; #endregion int hh = f1.Ye; int ic = 0; for (int D = 0; D <= 11; D++) { int hye = hh; MessageBox.Show(D.ToString()); if (Mo[D] < 4) { hye = hh + 1; } int hmo = Mo[D]; // 2004年02月の日数を取得する int iDaysInMonth = DateTime.DaysInMonth(hye,hmo); //日数を積算 ic=ic + 31; int Sic = 31*D + 1; int Dic = 0; for (int N = Sic; N <= ic; N++) { Dic = Dic + 1; //必要な変数を宣言する DateTime dateValue = new DateTime(hye, hmo, Dic); // 曜日を取得する DayOfWeek uWeekday = dateValue.DayOfWeek; string W = ("日月火水木金土").Substring(int.Parse(dateValue.DayOfWeek.ToString("d")), 1); //MessageBox.Show(W.ToString()); string NI = Convert.ToString(Dic); if (Dic > iDaysInMonth) { NI = ""; W = ""; } //Labelに文字を入力。 string h = "label" + N; string hY = "label" + (N + 372); //MessageBox.Show(hY.ToString()); //日数を記入 Control[] cs = this.Controls.Find(h, true); ((Label)cs[0]).Text = NI; //曜日の記入 Control[] css = this.Controls.Find(hY, true); ((Label)css[0]).Text = W; } } いろいろ調べて //必要な変数を宣言する DateTime dateValue = new DateTime(hye, hmo, Dic); こいつが何らかの影響を及ぼしていることまではつかんだのですが,何が悪いのか,また, どうすれば改善できるのか解らず困っています. ご教授よろしくお願いいたします.

  • VBAでUserFormでProgressBarとLabelを同時表示できない理由は?

    VBAでUserFormをつかってProgressBarとLabelを同時に表示させる。つもりでしたが、ProgressBarが満たされた後Labelが表示されます。その理由と対策を教えて下さい。そのコードを以下に示します。 Sub a() With UserForm1 .Show vbModeless .Label1 = "始めのテキスト" End With s = 1 e = 20000 For i = s To e UserForm1.Label1 = "始めのテキスト" UserForm1.ProgressBar1.Value = i / e * 1000 Next i End Sub お願いします。

専門家に質問してみよう