Delphi - 保持系统messages/prevent UI重画?

Delphi - hold the system messages/prevent UI redrawing?

这听起来可能很傻,但我遇到过一些情况,当我希望应用程序不显示正在发生的事情时,直到另一个特定的动作发生(stringGrids 已填充数据,UI 已准备好...)。有没有办法阻止消息从应用程序发送到 OS?

那么,有没有反对意见

application.processmessages

? 类似于:

application.stopProcessingMessages;

fill stringGrids, prepare the UI...

application.processMessagesAgain;

?

当然,我可以 运行 在单独的线程中执行这些操作,但有些情况下我不想或不能在单独的线程中执行。

勾选TDataSet.DisableControls for data aware controls, and BeginUpdate / EndUpdate for some VCL / RTL classes (including TStrings), and - specific for the mentioned TStringGrid - see Delphi TStringGrid Flicker

事实证明,虽然我认为使用 WM_SETREDRAW 消息是正确的解决方案,但它有一些缺点。最大的一个是,如果使用,用户可以点击表单。所以最终的解决方案就是像这样

将一个空的 TPanel 放在整个表单上
  panel1.Left:= 0;
  panel1.Top:= 0;
  panel1.Width:= frmMain.Width;
  panel1.Height:= frmMain.Height;

表格准备好后,面板缩小,不可见等。它可靠地隐藏了所有闪烁和其他东西,看起来不太好,我想对用户隐藏它们。