是否有另一种方法可以在不使用Application.ProcessMessages的情况下加载MSHTML文档?

时间:2010-04-09 18:11:45

标签: delphi mshtml

是否有其他方法可以在不使用Application.ProcessMessages的情况下加载MSHTML文档?

要将文档加载到IHTMLDocument中,我需要这样做:

while Doc.readyState <> 'complete' do 
   Application.ProcessMessages;

我希望在加载过程中不处理所有的消息队列,因为我会改变我的应用程序流,换句话说,在加载完成后应该处理的一些消息可以更早地处理,甚至在加载之前端。

IHTMLDocument期望在加载过程中有一个特殊的消息代码?或者有另一种加载方式?

3 个答案:

答案 0 :(得分:6)

对Application.ProcessMessages的调用很可能只是允许MSHTML activeX控制时间来完成加载文档。听起来他们在这里使用协同多任务模拟在后台加载文档 - ActiveX将消息发布到自身以处理下一个块或其他任何内容。

通常情况下,这不会影响您的应用流量,因为文档加载会作为正常消息循环的一部分发生。但是因为你想要同步加载文档(在文档完全加载之前不做任何其他事情),你对通过消息进行后台加载的方式很敏感。

一种解决方案:查看是否可以删除同步加载文档的要求。让负载在发生时发生,但将readState = complete的检查移动到计时器中,可能是1秒间隔。当计时器发现文档加载完成后,启动下游食物链活动。

另一种解决方案:在等待加载文档时显示模式对话框。这样做的好处是可以禁用UI的其余部分,这样就不会冒可重入的风险。调用ProcessMessages意味着用户仍然可以与您的窗口进行交互,单击按钮,菜单等。通常这会导致问题。显示模态对话框(“进度对话框?”)可以通过禁用模态对话框后面的所有内容来避免重入。

第三种可能性:用PeekMessage和逻辑替换Application.ProcessMessages以检查消息,以决定是让它通过还是将其放回消息队列以供以后使用。这有点脏,但可能在非常特殊的情况下工作。

我推荐方法#2,即模态对话框。

答案 1 :(得分:3)

组件TEmbeddedWB包含一些辅助函数,如LoadFromFile和LoadFromStream,它们将文档直接加载到MSHTML控件中。将完整的逻辑移动到onDocumentComplete事件中。

答案 2 :(得分:1)

有一个TEmbeddedWB.OnDocumentComplete事件,在文档完成加载时触发。您有什么特别的理由不想使用它吗?