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

Dou*_*ise 2 delphi mshtml

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

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

while Doc.readyState <> 'complete' do 
   Application.ProcessMessages;
Run Code Online (Sandbox Code Playgroud)

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

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

dth*_*rpe 6

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

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

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

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

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

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