Lazarus:Application.ProcessMessages的效果

时间:2014-06-26 12:48:38

标签: lazarus

我有以下代码,正确在消息框中显示 InvoicingUnit 。它还会正确显示标题中的值。

  ADItemRecord := GetInvItemRecord(txtItemCode.Text);
  ShowMessage(ADItemRecord.InvoicingUnit );
  lblUnit.Caption := ADItemRecord.InvoicingUni;

但是,以下更改(即删除消息框)显示标题。标题是空白的。

  ADItemRecord := GetInvItemRecord(txtItemCode.Text);
  lblUnit.Caption := ADItemRecord.InvoicingUni;

我认为这与程序进入下一行之前数据在记录中准备就绪有关。所以我做了以下更改,希望程序能正确完成提取,然后再继续。

  ADItemRecord := GetInvItemRecord(txtItemCode.Text); //Fetch data from DB
  Application.ProcessMessages; //Wait for it to complete (I think)
  lblUnit.Caption := ADItemRecord.InvoicingUnit;
  Application.ProcessMessages;

但上述变化无效。

我是否正确地假设调用Application.ProcessMessages将等到上一行正确完成?

函数GetInvItemRecord用于从数据库中获取记录。 该程序基于Postgres在Ubuntu上构建。

2 个答案:

答案 0 :(得分:3)

Application.ProcessMessages表示应用程序可以从其事件队列中执行事件。假设您在表单上有2个按钮,分配了onclick程序。第一个过程是一个长期过程(例如repeat ... until true)。第二个按钮只有ShowMessage('haha')

现在,在repeat语句的第一个过程中没有插入appllication.processmessages,如果按第一个按钮,那么在重复语句完成之前,您将无法按下第二个按钮(或其他任何内容)。因此用户界面被冻结。

将application.processmessages插入,如

 repeat
   Application.ProcessMessages;
   ...
 until true;

如果按第一个按钮然后按第二个按钮,就会出现showmessage!所以,这是伪造多线程应用程序的一种方法: - ))

我希望我很清楚。

答案 1 :(得分:1)

这是其中一项困难因素,因为我不知道该寻找什么。我在这里包含了我的答案,以便其他人也可以从中受益。

我想也许这不是调用函数来获取数据的问题(延迟),而是延迟屏幕绘制或刷新的问题。然后我找到了这两个链接:

What's the difference between Refresh, Update and Repaint?

和此:

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Controls_TControl_Update.html

所以我决定在将值分配给标题后调用Update过程。这是解决我问题的方法。

我仍然不确定Application.ProcessMessages是如何运作的 - 微笑。