記事"グラフィカルインタフェースIX:プログレスバーと折れ線グラフコントロール(チャプター2)"についてのディスカッション - ページ 2

 
Artyom Trishkin:

なぜか?

プログラムの最初にデータの型を 宣言し、その後に宣言した型の変数の値を開始する。

m_progress_bar.Update(i,total);は何もしていない。どのような大きさのバーを表示すべきでしょうか?

 
Алексей Тарабанов:
プログラムの最初にデータの型を 宣言し、その後に宣言した型の変数の値を開始する。
ループ変数の何が問題なのか?
 
Алексей Тарабанов:

...

m_progress_bar.Update(i,total);は全く何もしていない。どのサイズのバーを表示すればいいのでしょうか?

double new_width=(m_current_index/m_steps_total)*m_bar_bg.XSize();
このように.
 
Artyom Trishkin:
このように

1.データ型の宣言

2.その型の変数への値の代入

辻褄が合わなければ、何かを間違えたことになる。

入室のルール

1.手榴弾。

2.自動小銃

3. Я.

主なものは、混ぜないこと。

 
Алексей Тарабанов:

1.データ型の宣言。

2.この型の変数に値を代入する

もし辻褄が合わなければ、何かを間違えたことになる。

入室のルール

1.手榴弾。

2.自動小銃

3. Я.

主なものは、混ぜないこと。

あなたの言葉は、休暇中の私の心には賢すぎるのかもしれない...。

なぜズイード・ズイード・ウエストなのか?

 
Artyom Trishkin:

Anatolyさん、押しつけがましくて申し訳ないのですが、重たい計算を伴うループの中でプログレス・バーを更新する方法を教えてください。

例えば、プログレスバーm_progress_barがあり、CProgramの中にループがあります。

このような "抽象的な "例で、私が理解していないことを説明していただけますか?

おそらく、これらの重い計算は、プログラムがFunc()関数を終了できないほど長いのでしょうか?プログレス・バーが更新されないのはそのためですか?永久ループがあるのでは?

   m_progress_bar.Show();  // なぜなら、このウィンドウがバインドされているウィンドウ(m_window.Show())を表示するときに、このウィンドウはすぐに表示されるからである、
                           // 非表示の状態で作成し、必要なときに表示したい

各要素にはShow()メソッドとHide()メソッドがあり、その可視性を制御します。

m_progress_bar.Hide();  // プログレス・バーを隠すには、別のグラフィカル・オブジェクトの下に隠さなければならない。

//---

一般的に、文脈から取り出されたコードブロックについて何かを言うのは難しい。プログレス・バーを使った動作例は、GUI X: Update for Easy And Fast library (build 2) にあります。

 

もっといいのは、再生用の最小限のコードを添付すること。これがヒントを得るための最速の方法だ。再生は簡単な図で十分です:

  • ボタンのあるメイン・ウィンドウ。
  • ( 1)ボタンと(2)プログレス・バー(作成直後は非表示)。

メイン・ウィンドウのボタンはダイアログ・ボックスを開く。ダイアログボックスのボタンは「重い計算」を開始する。

 
Anatoli Kazharski:

おそらく、これらの重い計算が長すぎて、プログラムがFunc()関数を終了できないのでは?プログレス・バーが更新されないのはそのためか?永久ループが存在するのだろうか?

各要素にはShow()メソッドとHide()メソッドがあり、その可視性を制御します。

//---

一般的に、文脈から取り出されたコードブロックについて何かを言うのは難しい。プログレス・バーを使った動作例は、GUI X: Update for Easy And Fast library (build 2) にあります。

はい、Anatolさん、あなたの例ではもちろん動作します。しかし、それはただの例であり、ただの飾りです。プログレスバー、その更新の例は、抽象的な値を持つタイマーで作られています。

仮の値を持つタイマーの中ではなく、タイマーではなく、プログラム内部の通常の長いループの中でそれをやり始めると、プログレスバーはループ中に更新されず、再び表示されるときにはすでに更新された状態で表示されます。

メインプログラムのループでプログレスバーを操作する例を教えていただけませんか?例えば、このようなループです:

//+------------------------------------------------------------------+
   //--- ボタンが押された場合
   //--- プログレスバーを表示しよう
   m_progress_bar_d1.Show();
   for(int i=0; i<sz; i++) {
      //--- プログレスバーを更新する
      Print(「プログレスバーの更新:インデックス=",i,", total=",sz);
      m_progress_bar_d1.Update(i,sz);
      double a=1;
      //--- 少々長い計算
      for(int k=0; k<(INT_MAX/16); k++) a=pow(a,a+a);
      }
   //--- プログレスバーを隠す
   m_progress_bar_d1.Hide();
//+------------------------------------------------------------------+

プログレス・バーを使った正しい操作を見てみたいのですが。

 
Artyom Trishkin:

そうだよ、アナトール、君の例ではもちろんうまくいく。しかし、それは見せかけの例に過ぎない。プログレス・バー、その更新の例は、抽象的な値を持つタイマーで作られている。

仮の値を持つタイマーの中ではなく、タイマーではなく、プログラム内部の通常の長いループの中でそれを始めると、プログレス・バーはループの間に更新されず、再び表示されるときにはすでに更新された状態で表示されます。

もしかしたら、ChartRedraw()が助けになるかもしれません。
 
Anatoli Kazharski:
もしかしたら、ChartRedraw()が助けになるかも?

はい、ありがとうございます: