2

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

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

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

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

IHTMLDocument 期望在加载过程中推进一个特殊的消息代码?还是有其他加载方式?

4

3 回答 3

6

对 Application.ProcessMessages 的调用很可能只需要让 MSHTML activeX 控件有时间完成加载文档。听起来他们在这里使用协作式多任务处理来模拟在后台加载文档 - ActiveX 向自己发布消息以处理下一个块或其他任何内容。

通常,这不会影响您的应用程序的流程,因为文档加载将作为正常消息循环的一部分发生。但是因为您希望同步加载文档(在文档完全加载之前不要执行任何其他操作),因此您对它通过消息进行后台加载的方式很敏感。

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

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

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

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

于 2010-04-09T18:26:39.843 回答
3

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

于 2010-04-09T18:27:08.437 回答
1

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

于 2010-04-12T08:44:54.170 回答