如何让TProgressBar停止滞后?

时间:2009-06-30 04:24:36

标签: delphi windows-vista delphi-2009

我有一个运行一系列操作的应用程序,我正在尝试使用TProgressBar来跟踪正在发生的事情。我设置了许多步骤,并调用.StepIt来增加进度条。

问题是,它没有很好地跟上。它似乎喜欢逐渐滑向它,而不是直接跳到正确的位置。如果它是你所追求的眼睛糖果,这一切都很好,但是当我试图准确地表达我的例程进展时,这使得它似乎总是落后于真实状态。如何关闭“功能”?

我只注意到在Windows Vista下发生这种情况。不确定它是否也在XP上进行,因为当我在XP上测试它时,过程进行得更快,而且过快。 :P但这可能是也可能不是特定于Vista的。无论哪种方式,它都让我疯狂。有谁知道如何解决它?

7 个答案:

答案 0 :(得分:6)

如果您不介意将进度条设为黄色而不是绿色,我会有一个快速但部分且不太优雅的解决方案:

  ProgressBar1.SmoothReverse := True;
  ProgressBar1.State := pbsPaused; // for yellow or pbsError for red

或者如果你不介意失去远景/主题外观并回到平坦的蓝色:

  UxTheme.SetWindowTheme(ProgressBar1.Handle, ' ', ' ');

据微软称,真正的“问题”是你试图将ProgressBar“变形”为他们认为不是的仪表。

您也可以尝试自己画画; - )

答案 1 :(得分:5)

Windows7上的问题!!

但答案已经出现在其中一篇较旧的帖子中:

如果tou使进度条向后退一步就没有延迟!!! 所以我实现了这个.....(并获得即时更新)

if(progress < ProgressBar.Max)
then
begin
  ProgressBar.Position := progress+1;
  ProgressBar.Position := progress; //This will set Progress backwards and give an instant update....
end
else
begin //cannot set position beyond max...
  ProgressBar.Max      := progress + 1;
  ProgressBar.Position := progress + 1;
  ProgressBar.Max      := progress; //This will also set Progress backwards also so instant update........
end;

答案 2 :(得分:3)

也许您可以尝试直接设置ProgressBar的位置,而不是使用StepIt过程。我在这里使用Delphi 7的XP,所以我无法测试它,但是查看TProgressBar的代码它使用了不同的消息(PBM_SETPOS而不是PBM_STEPIT)。所以也许它可以在没有动画的情况下设置进度条的位置。

答案 3 :(得分:3)

此外,有几个第三方组件提供了更好的进度条实现,仍然可以在Vista上呈现。就个人而言,我更喜欢来自Raize components的那个非常好的。它不像Windows控件那样“滞后”,并且独立于任何主题而工作。

如果你真的不想要任何花哨的东西,那么你总是可以自己建造一个面板,并在面板内左边对齐一个t形。将tshape的大小调整为其设置的面板的百分比。

答案 4 :(得分:3)

前一段时间我遇到了完全相同的问题。在Google搜索了 long 时间之后,我发现这是一个特定于Vista的问题。它似乎归结为:微软为Vista中的进度条控件添加了精美的动画(即移动的'突出显示')。为了使更新更加顺畅,他们在控件的重绘中实现了某种“滞后” - 这基本上是整个进度条控制的螺丝。我会说,相当恼人,特别是因为似乎没有一个像样的解决方案

有关详情,请参阅Arvid Winkelsdorf对this Embarcadero Discussion Forum post的回复:

  

VB,C ++和C#都是一样的   不知何故,问题在于   Vista绘制的新动画   ProgressBars。提供更顺畅的   视觉反馈绘图延迟   前进的时候。你的申请   不能确定100%会是   在任何给定的时间达到。

     

通过将位置设置回a   较小的值,ProgressBar绘图   被迫跳回来。没有延误   到达比小的位置   当前。所以你将有近100%   立即。然后设置为   最大,你将完全100%。

     

[...]

     

使用时会出现类似的故障   新的Vista ProgressBar样式就像   PB暂停或PB错误。如果酒吧是   还在移动(MS部分)和你的应用程序   将颜色设置为暂停   SendMessage(就像在D2009中一样)   消息将被忽略   进度。

答案 5 :(得分:1)

我遇到了同样的问题,我的解决方案是切换到VCL中另一个可用的控件:

我选择使用Range of TTrackBar来显示进度。 (滑块关闭,控制器调整大小以隐藏范围标记)。

不一样的视觉效果(特别是主题),但它很适合我的需要(没有滞后)。

答案 6 :(得分:0)

  

这是一个简单的解决方案:
       for(var i = 0; i < secondaryFeatured.length; i++) { secondaryFeatured[i].click(function() { set(list.$(this)); }); }