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;
表格准备好后,面板缩小,不可见等。它可靠地隐藏了所有闪烁和其他东西,看起来不太好,我想对用户隐藏它们。
这听起来可能很傻,但我遇到过一些情况,当我希望应用程序不显示正在发生的事情时,直到另一个特定的动作发生(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;
表格准备好后,面板缩小,不可见等。它可靠地隐藏了所有闪烁和其他东西,看起来不太好,我想对用户隐藏它们。