0

基本问题:调用更新过程时,TStatusBar 闪烁。轻松解决此问题的方法

执行的代码在问题第一部分的第一部分(你可以看到浅灰色的分隔线)......

但是 - 问题是在执行此代码时,表单不会自动激活并专注于所有其他应用程序的顶部。

我读过这些文章:

http://www.installationexcellence.com/articles/VistaWithDelphi/Original/Index.html
http://delphi.about.com/od/formsdialogs/l/aa073101b.htm

但根据他们的说法,无论如何它都应该起作用。我用 Show 尝试了所有的 TApplicationEvents 和 TForm 事件;可见:重绘;刷新; 带到前面;...没有任何作用。

所以 - 我想我有两个选择 - 多线程或捕获 WM_SYSCOMMAND 消息,并在 SC_ACTIVE 事件中简单地重新绘制表单。这个场景能成功吗?

4

1 回答 1

4

您的链接文章都没有解决您遇到的问题。您看到的是不处理 Windows 消息的程序的行为,因此它不会重绘无效的部分,并且不会对键盘或鼠标输入做出反应(例如使用鼠标移动或调整大小,或应用程序激活)使用任务栏按钮)。

在您调用的代码StatusBar1.Update中,至少会重绘状态栏文本,但除了进入前台之外,您的应用程序可能还会忽略移动或调整大小请求。

您需要及时处理 Windows 消息,因此任何花费超过 200 或 300 毫秒的执行路径都需要确保消息得到处理,否则应用程序将出现无响应或挂起。

你基本上有三个选择:

  • 保留长时间运行的代码,并插入调用Application.ProcessMessages- 这将允许处理 Windows 消息。确保避免再次输入代码,例如禁用所有用于启动操作的控件。

  • 重新编写代码,使其显示为一系列步骤,每个步骤不超过 10 毫秒。在计时器事件处理程序中调用代码,或从Application.OnIdle处理程序调用它。

  • 在工作线程中调用您的代码,并将消息发布到主 GUI 线程以更新您的 UI。

所有这些选项都有自己的优点和缺点,特别是对于多线程,SO 上已经有很多问题和答案。当您从事的不仅仅是玩具程序时,这是最困难但总体上最好的选择。

于 2009-07-20T11:04:17.693 回答