【问题标题】:How can I disable screen update which updating a lot of controls?如何禁用更新大量控件的屏幕更新?
【发布时间】:2010-09-25 02:25:50
【问题描述】:

我有一个包含 50 个或更多控件的表单,我在运行时创建并添加了这些控件。我不想看到然后一一出现;我宁愿在开始时禁用绘图/开始缓冲,然后立即看到它们全部出现。

我似乎记得大约 10 年前在 BCB 做过这样的事情,但忘记了是怎么做的。

【问题讨论】:

  • 您可以将所有这些控件放在 TPanel 上并显示/隐藏它。但是你确定你真的需要 50 个控件吗?也许您会更好地使用由 50 个部分组成的单个自定义控件?我不知道你的情况是什么,但根据我的经验,当有人在表单中添加大量类似的控件时,他/她真的应该为自己构建一个包含大量类似部分的新控件!
  • 好点(+1),但它并不总是相同的控件。它们是由某些用户选择动态创建的,然后他可以定位它们。有一个 Save 选项,我关心的是 Load 上的重绘。

标签: delphi


【解决方案1】:

我不确定是否有特定于 Delphi 的方法来执行此操作,但使用 Win32 API,这是通过 WM_SETREDRAW 消息完成的。

编辑:感谢 Ken White 和 Sertac Akyuz 提供以下示例代码。

begin
  // Defer updates
  SendMessage(Handle, WM_SETREDRAW, WPARAM(False), 0);
  try
    // Create all your controls here
  finally
    // Make sure updates are re-enabled
    SendMessage(Handle, WM_SETREDRAW, WPARAM(True), 0);
    // Invalidate;  // Might be required to reflect the changes  
  end;
end;

【讨论】:

  • +1,我希望你的回答能很快得到很多人的支持,以阻止LockWindowUpdate 的回答。
  • LockWindowUpdate 旨在停止绘制以进行拖放,它比 WM_SETREDRAW 更进一步,因为它可以假设用户正在做什么。一个假设是,由于发生了拖放,因此可以禁用/忽略窗口移动。您仍然可以拖动一个将 WM_SETREDRAW 设置为 false 的窗口。
  • @Mawg:请参阅“LockWindowUpdate 不应该使用哪些操作?” (blogs.msdn.com/b/oldnewthing/archive/2007/02/22/1742084.aspx)
  • @Mawg:我可以,但我会觉得盗取卡萨布兰卡应有的名声非常糟糕,所以我会让他这样做! @casablanca:请附上代码 sn-p!
  • @Ken 和 Sertac:谢谢你们。我已经有 10 年没有使用 Delphi 了,所以我很高兴有人能够提供示例代码。
【解决方案2】:

我只是保持 Visible = False 直到一切就绪。

【讨论】:

  • +1 这也是一种可能(我有想过,就是想看看有没有别的办法)
  • @Mawg,对于运行时组件创建,似乎保持 Visible = False “感觉”更好,而使用 WM_SETREDRAW “感觉”更好地更新已经存在且已经可见的控件。
  • 保持 Visible=False 并不是那么好。 WM_SETREDRAW 要好得多。特别是当控件为 Align=alClient 并连接到 TSplitter 时,设置 Visible=False 会搞砸整个布局。而且速度也比较慢。
猜你喜欢
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 2022-01-20
  • 2010-09-13
  • 2019-07-25
  • 1970-01-01
相关资源
最近更新 更多