gpt4 book ai didi

delphi - 是否有另一种不使用 Application.ProcessMessages 加载 MSHTML 文档的方法?

转载 作者:行者123 更新时间:2023-12-03 18:08:52 25 4
gpt4 key购买 nike

是否有另一种不使用 Application.ProcessMessages 加载 MSHTML 文档的方法?

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

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

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

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

最佳答案

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

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

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

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

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

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

关于delphi - 是否有另一种不使用 Application.ProcessMessages 加载 MSHTML 文档的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2609785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com