文章 "图形界面 IX: 进度条和线形图表控件 (第二章)" - 页 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. Я.

最重要的是不要混淆。

也许你的话对我度假的头脑来说太明智了....。

为什么是zuid-zuid-west?

 
Artyom Trishkin:

阿纳托利,很抱歉打扰您,但我想知道如何才能在一个计算量很大的循环中更新进度条。

例如,我们有一个进度条 m_progress_bar,在 CProgram 内部有一个循环。

您能在这样一个 "抽象 "的例子中解释一下我不明白的地方吗?

也许这些繁重的计算太长,以至于程序无法退出Func() 函数?这就是进度条不更新的原因吗?也许这里有一个永久循环?

   m_progress_bar.Show();  // 是没有意义的,因为在显示绑定它的窗口 (m_window.Show()) 时,它已经立即可见、
                           // 我希望将其创建为隐藏状态,并在需要时显示出来

每个元素都有Show() 和Hide() 方法来控制其可见性。

m_progress_bar.Hide();  由于某些原因,// 不能隐藏进度条,我必须将其隐藏在另一个图形对象下。

//---

一般来说,断章取义的代码块很难说明问题。GUIs X: Updates for Easy And Fast library (build 2) 一文中展示了一个带有进度条的示例,该示例一切正常。

 

更好的办法是,附上一段最短的代码以供播放。这是获得提示的最快方法。一个简单的示意图就足以重现:

  • 带按钮的主窗口。
  • 带有两个元素的对话窗口:(1) 一个按钮;(2) 一个进度条,最初是隐藏的(创建后立即隐藏)。

主窗口上的按钮打开对话框。对话框上的按钮启动 "大量计算"。

 
Anatoli Kazharski:

可能这些繁重的计算时间太长,以至于程序无法退出Func() 函数?这就是进度条不更新的原因?也许这里有一个永久循环?

每个元素都有Show() 和Hide() 方法来控制其可见性。

//---

一般来说,断章取义的代码块很难说明问题。GUIs X: Updates for Easy And Fast library (build 2) 一文中展示了一个带有进度条的示例,该示例一切正常

是的,阿纳托尔,在你的示例中当然可以运行。但这只是个例子,只是个装饰。进度条的更新示例是用抽象值的计时器制作的。

当我不是在一个带有假设值的计时器中,而是在程序内部一个普通的长循环中,而不是在一个计时器中开始运行时,进度条不会在循环过程中更新,而是在再次显示时已经更新。

您能否举例说明在主程序的某个循环中如何使用进度条?例如,在这样一个循环中:

//+------------------------------------------------------------------+
   //--- 如果按下按钮
   //--- 显示进度条
   m_progress_bar_d1.Show();
   for(int i=0; i<sz; i++) {
      //-- 更新进度条
      Print("更新进度条:index=",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() 可以帮上忙?

是的,谢谢,m_chart.Redraw() 帮了大忙:

MetaTrader 交易平台截图

kbr, d1, 2016.08.22.

Just2Trade Online Ltd, MetaTrader 5, 演示版

KBR,D1,2016.08.22,Just2Trade Online Ltd,MetaTrader 5,模拟