我有以下代码,正确在消息框中显示 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上构建。
答案 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?
和此:
所以我决定在将值分配给标题后调用Update
过程。这是解决我问题的方法。
我仍然不确定Application.ProcessMessages
是如何运作的 - 微笑。