如何禁用更新大量控件的屏幕更新?

Maw*_*awg 13 delphi

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

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

cas*_*nca 41

我不确定是否有特定于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;
Run Code Online (Sandbox Code Playgroud)

  • +1,我希望你的答案很快得到很多upvotes来阻止[`LockWindowUpdate`]的答案(http://msdn.microsoft.com/en-us/library/dd145034%28VS.85%29.aspx) . (9认同)
  • @Mawg:请参阅"LockWindowUpdate无法使用哪些操作?" (http://blogs.msdn.com/b/oldnewthing/archive/2007/02/22/1742084.aspx) (8认同)
  • LockWindowUpdate旨在停止拖放绘图,它比WM_SETREDRAW更进一步,因为它可以假设用户正在做什么.一个假设是,由于发生拖放,可以禁用/忽略窗口移动.您仍然可以拖动WM_SETREDRAW设置为false的窗口. (5认同)
  • 只是出于好奇,为什么? (2认同)

Cos*_*und 9

我只是保持Visible = False,直到一切都很好并准备就绪.

  • @Mawg,运行时组件创建好像保持可见=假"感觉"更好,同时使用WM_SETREDRAW"感觉"用于更新现有的和已经显现的控制更好. (5认同)
  • 保持可见=假不是那么好.WM_SETREDRAW要好得多.特别是,当控件是Align = alClient并连接到TSplitter时,设置Visible = False会搞砸整个布局.它也慢了. (2认同)