Есть ли другой способ загрузки документов MSHTML без использования Application.ProcessMessages? - PullRequest
2 голосов
/ 09 апреля 2010

Есть ли другой способ загрузки документов MSHTML без использования Application.ProcessMessages?

Чтобы загрузить документ в IHTMLDocument, мне нужно сделать следующее:

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

Я хочу не обрабатывать все очереди сообщений во время загрузки, поскольку я буду изменять поток своих приложений, другими словами, некоторые сообщения, которые должны обрабатываться после завершения загрузки, могут быть обработаны раньше, даже до загрузки конец.

Есть специальный код сообщения, который IHTMLDocument ожидает, чтобы продвинуться в процессе загрузки? Или есть другой способ загрузки?

Ответы [ 3 ]

6 голосов
/ 09 апреля 2010

Вызов Application.ProcessMessages, скорее всего, просто необходим, чтобы позволить времени управления ActiveX MSHTML завершить загрузку документа. Похоже, что они используют совместную многозадачность здесь для имитации загрузки документа в фоновом режиме - ActiveX отправляет сообщения самому себе для обработки следующего фрагмента или чего-то еще.

Обычно это не влияет на поток вашего приложения, потому что загрузка документа происходит как часть вашего обычного цикла обработки сообщений. Но поскольку вы хотите загружать документ синхронно (больше ничего не делать, пока документ полностью не загружен), вы чувствительны к тому, как он выполняет фоновую загрузку через сообщения.

Одно решение: посмотрите, можете ли вы удалить требование для синхронной загрузки документа. Пусть загрузка произойдет, когда это произойдет, но перенесите проверку на readState = complete в таймер, возможно, с интервалом в 1 секунду. Когда таймер обнаружит, что загрузка документа завершена, включите ваши действия вниз по цепочке питания.

Другое решение: отобразить модальное диалоговое окно в ожидании загрузки документа. Преимущество этого заключается в отключении остальной части вашего пользовательского интерфейса, поэтому вы не рискуете вернуться. Вызов ProcessMessages означает, что пользователь все еще может взаимодействовать с вашим окном, нажимать кнопки, меню и т. Д. Обычно это приводит к проблемам. Отображение модального диалога («Ход выполнения?») Позволяет избежать повторного входа, отключив все, что находится за модальным диалогом.

Третья возможность: замените Application.ProcessMessages на PeekMessage и логику, чтобы проверить сообщение, чтобы решить, пропустить его или вернуть обратно в очередь сообщений. Это немного грязно, но может работать в очень особых случаях.

Я рекомендую подход № 2, модальное диалоговое окно.

3 голосов
/ 09 апреля 2010

Компонент TEmbeddedWB содержит некоторые вспомогательные функции, такие как LoadFromFile и LoadFromStream, которые загружают документ непосредственно в элемент управления MSHTML. Переместите свою полную логику в событие onDocumentComplete.

1 голос
/ 12 апреля 2010

Событие TEmbeddedWB.OnDocumentComplete возникает, когда документ завершает загрузку. Есть ли какая-то особая причина, почему вы не хотите этим пользоваться?

...