停止标签标题闪烁

use*_*616 5 delphi flicker delphi-7

我有一个标签,指示文件大小

FormatFloat('##.## KB',BytesIn/OneKB);
Run Code Online (Sandbox Code Playgroud)

当文件都低于2MB时,一切正常.现在我有时使用2GB及以上的文件.

FormatFloat('##.##### MB',BytesIn/OneMB);
Run Code Online (Sandbox Code Playgroud)

标题正在每1 KB更新一次,闪烁非常激烈.

有什么方法可以阻止或最小化它?

Dav*_*nan 10

德尔福TLabel确实可以成为一个怪异的野兽.很多人会推荐双缓冲,但我不喜欢这样.它带来了其他问题.特别是,如果您使用主题,则双缓冲可能会干扰主题渲染.

我处理标签闪烁的技巧是使用a TStaticText而不是a TLabel.这是一个窗口控件,一个围绕Windows STATIC控件的包装器,根据我的经验,它总是不会在可能的情况下闪烁TLabel.

正如其他人所提到的,限制更新率是一个合理的想法,无论闪烁如何都是明智的.没有必要花费资源来更新UI,这比人眼可以吸收的更快.对于类似下载进度的东西,在我的视图中你不应该需要超过5Hz.这可能是您的问题的根本原因,如果限制更新率解决了问题,那么您可以坚持下去TLabel.

我的答案有一些更普遍的反闪烁提示:TLabel和TGroupbox Captions Flicker on Resize.

  • @Peter,这不是解决方案.这是解决背后问题的一种解决方法.如果标签更新频率较低,则不会闪烁.OP现在必须频繁更新该标签,用户甚至无法读取新值. (2认同)
  • @David:但可能不是。:-) 使用 `TStaticText` 来解决这个问题并不是一个解决方案。如果在当今的带宽速度下,针对 >= 2GB 的内容**每 KB** 更新标签,则应该会出现闪烁。不必要时使用“TStaticText”的缺点是它使用窗口句柄(HWND),而“TLabel”则不使用。(当然,现在这不像以前那么重要,但仍然......“不浪费,不想要。”)。不是反对票 - 只是评论。 (2认同)