我有一个运行一系列操作的应用程序,我正在尝试使用TProgressBar来跟踪正在发生的事情。我设置了许多步骤,并调用.StepIt来增加进度条。
问题是,它没有很好地跟上。它似乎喜欢逐渐滑向它,而不是直接跳到正确的位置。如果它是你所追求的眼睛糖果,这一切都很好,但是当我试图准确地表达我的例程进展时,这使得它似乎总是落后于真实状态。如何关闭“功能”?
我只注意到在Windows Vista下发生这种情况。不确定它是否也在XP上进行,因为当我在XP上测试它时,过程进行得更快,而且过快。 :P但这可能是也可能不是特定于Vista的。无论哪种方式,它都让我疯狂。有谁知道如何解决它?
答案 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)); }); }