【发布时间】:2016-03-24 17:04:54
【问题描述】:
这听起来可能很傻,但我遇到了一些情况,当我希望应用程序不显示正在发生的事情时,直到发生另一个特定操作(stringGrids 已填充数据,UI 已准备好......)。有没有办法阻止消息从应用程序发送到操作系统?
那么,有什么反对意见
application.processmessages
? 比如:
application.stopProcessingMessages;
fill stringGrids, prepare the UI...
application.processMessagesAgain;
?
当然,我可以在单独的线程中运行这些操作,但在某些情况下我不想,或者不能在单独的线程中执行。
【问题讨论】:
-
什么是网格?没有Application.StopProcessingMessages,但是根据您具体执行的操作,有一些方法可以阻止某些组件更新屏幕。但是,由于您没有发布任何真正的相关信息,因此很难提供建议。你发布的代码几乎是我有代码可以做废话,废话,废话。如果没有任何细节,我该如何更改该代码的行为?
-
这个皮肤有很多不同的方法。从使用控件而不是网格开始。例如,虚拟模式列表视图。将所有数据保存在 UI 控件中是糟糕的设计。你只是在收获它的后果。抑制绘画将是修补它的一种方法。实现起来并不难。你永远不应该打电话给
ProcessMessages。更好地了解 Windows 消息的工作原理可能会让您受益。 -
我不想完全坚持网格示例。但在这种情况下,我说的是 TStringGrid
-
您可以使用
WM_SETREDRAW来暂停重绘。坦率地说,您的设计听起来很错误,我认为您对系统如何工作的理解存在问题。花大量时间从主线程工作是一个大问题。如果收集数据需要时间,请在后台线程中进行。完成后,更新 UI。 -
如果您在后台收集新数据,则无需禁止任何绘画,然后在获得所有数据后进行更新。这只是一个更好的解决方案。
标签: delphi user-interface redraw