WebBrowser, DoEvents и проблемы с .ReadyState

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

WebBrowser, DoEvents и проблемы с .ReadyState

Сообщение Source » 04.09.2007 (Вт) 11:26

загрузил свою страницу в WebBrowser. После вызова DoEvents WB.ReadyState со значения 4 (READYSTATE_COMPLETE) принимает значение 3. С чего бы вдруг, спрашивается?
Вложения
WB_readyState.zip
(1.5 Кб) Скачиваний: 44

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.09.2007 (Вт) 11:53

Во-первых не надо ждать While WB.Document Is Nothing, только READYSTATE_COMPLETE. Объект может уже быть, но не весь, и работа с ним может привести к непредсказуемым ошибкам.
Во-вторых ReadyState становится READYSTATE_INTERACTIVE (3) после write, а не DoEvents, и остается в этом состоянии.
In many cases, the control will not differentiate between loaded and interactive; in that case, the control is interactive immediately and this property reflects at least READYSTATE_INTERACTIVE.

В-третьих само DoEvents в комбинации с загрузкой документа в IE 7 может выдавать Automation error, поэтому необходим обработчик ошибки.
Лучший способ понять что-то самому — объяснить это другому.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 04.09.2007 (Вт) 16:38

Но, Antonariy, во вторых - Debug.Print "WB.readyState1="; WB.ReadyState после метода Write выдаёт 4, а не 3.

что же я буду тогда ожидать при последующих изменениях документа, если WB.ReadyState=3 постоянно, у меня потом на innerhtml прога зависает :
Код: Выделить всё
   WB.document.All.NameDIV.innerHTML = sHTML
    While WB.readyState <> READYSTATE_COMPLETE
        DoEvents
    Wend


Также интересно, если DoEvents убрать из цикла, или поставить Sleep 1 (загрузка происходит в Form_Load, событий от пользователя нет), то на загрузке пустой страницы (about:blank) прожка зависает, на цикле после метода Write всё гладко.

само DoEvents в комбинации с загрузкой документа в IE 7 может выдавать Automation error, в каких случаях это происходит?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.09.2007 (Вт) 17:37

что же я буду тогда ожидать при последующих изменениях документа, если WB.ReadyState=3 постоянно, у меня потом на innerhtml прога зависает :
Не надо там ничего ждать.
в каких случаях это происходит?
В непредсказуемых.
Лучший способ понять что-то самому — объяснить это другому.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 04.09.2007 (Вт) 17:50

Antonariy писал(а):
что же я буду тогда ожидать при последующих изменениях документа, если WB.ReadyState=3 постоянно, у меня потом на innerhtml прога зависает :
Не надо там ничего ждать.


Как раз мне надо ждать окончания формирования документа, потому как я после innerHTML получаю значения скроллов и они не верны, т.к. на момент получения загружена только часть HTML в WB!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.09.2007 (Вт) 18:15

Не знаю насчет значений скроллов, но эта операция синхронная, в отличие от загрузки, сам так делаю. После присвоения значения все элементы доступны.
Лучший способ понять что-то самому — объяснить это другому.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 04.09.2007 (Вт) 20:41

а почему на цикле первоначальной загрузки пустого документа без DoEvents прожка виснет, а на методе Write можно обойтись без DoEvents?

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 04.09.2007 (Вт) 22:39

оказывается, ScrollTop принимает другое значение, но почему, никак не пойму:
WB.document.Body.ScrollTop=329
после сей команды ScrollTop=104 при WB.document.Body.ScrollHeight=1536 и WB.Height=3217 (214px). Явно изображение HTML не выходит за пределы (329+214)<1536, почему ScrollTop меняется?
Также я перемещал скролл в самый низ таким способом: WB.document.Body.ScrollTop=WB.document.Body.ScrollHeight и скролл устанавливался где-то посреди документа...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 05.09.2007 (Ср) 9:26

Source писал(а):а почему на цикле первоначальной загрузки пустого документа без DoEvents прожка виснет, а на методе Write можно обойтись без DoEvents?
Потому что загрузка - операция асинхронная, а write и прочие манипуляции с готовым документом - синхронные.
оказывается, ScrollTop принимает другое значение, но почему, никак не пойму:
Тут уж разбирайся сам :roll:
У осла капризов хватает.
Лучший способ понять что-то самому — объяснить это другому.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 05.09.2007 (Ср) 14:29

после innerHTML поставил DoEvents и всё стало прекрасно! Значит, innerHTML просто записывает страницу в память, но отображения её не ожидается, потому и значения скроллов не верны!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 95

    TopList