如何同时更改控件而不重新绘制每个控件?

Ale*_*der 7 forms delphi repaint

例如,我需要在运行时禁用两个按钮.在我禁用第一个按钮后,它会变成灰色,第二个 - 它也会变成灰色.但我不知道如何同时重新粉刷!

我需要这样的东西:

  1. 冻结表格(禁用重新绘制)
  2. 禁用第一个按钮
  3. 禁用第二个按钮
  4. 启用表单重新绘制

如何实现?

Rem*_*eau 10

查看Win32 API WM_SETREDRAW消息.例如:

SendMessage(Handle, WM_SETREDRAW, False, 0);
Button1.Enabled := False;
Button2.Enabled := False;
SendMessage(Handle, WM_SETREDRAW, True, 0);
InvalidateRect(Handle, nil, True);
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!通过非常小的更改,它可以实现perfekt:SendMessage(Handle,WM_SETREDRAW,0,0); Dutton1.Enabled:= False; Dutton2.Enabled:=假; SendMessage(Handle,WM_SETREDRAW,-1,0); 重绘; (2认同)

Del*_*ics 5

在应用程序重新进入消息循环之前,无法处理消息,因此任何修改/更新依赖于消息处理的控制状态的尝试都不会在不"消息"消息的单个代码序列中起作用.

幸运的是,VCL控件通常通过Update方法提供强制重新绘制的方法,而无需等待消息处理:

Button1.Enabled := False;
Button2.Enabled := False;
Button1.Update;
Button2.Update;
Run Code Online (Sandbox Code Playgroud)

这与独立于禁用表单重新绘制无关.窗体不会重新绘制,直到您的应用程序进入消息循环,无论如何,因此禁用形式绘画,本身并不导致邮件处理单个过程中重新启用是在浪费时间.

这可能不是完全同时重新绘制两个按钮,但真正同时绘制两个单独的控件是不可能的,如果没有进入多线程GUI绘画代码,我认为这超出了这个问题的范围.以这种方式调用两个按钮上的更新将尽可能接近同时生效.