Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Вниз

Как узнать об окончании загрузки Webbrowser ом локального html?   Найти похожие ветки 

 
Дмитрий В. Белькевич   (2003-10-24 18:42) [0]

Имеем некий html, лежащий локально. Через потоки засовываем его в webbrowser. По окончании загрузки нужно произвести некоторые необходимые действия. Как узнать, что загрузка закончена?
Пробовал много вариантов. Либо html недогружается, либо прога виснет в бесконечном цикле, ожидая окончания загрузки.
Сейчас вариант жутко черезпопический, хотя на "чистых" html"ах дает хорошие результаты:

sl.Text := DRP.DicomReportPages[CurrentPage].HtmlString;
sl.SaveToStream(ms);
ms.Seek(0, 0);
(WebBrowser1.Document as
IPersistStreamInit).Load(TStreamAdapter.Create(ms));
while WebBrowser1.Document = nil do
Application.ProcessMessages;
if WebBrowser1.Document <> nil then
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
while HTMLDocument.body = nil do
Application.ProcessMessages;
s := HTMLDocument.body.outerHTML;
while length(s) < length(DRP.DicomReportPages[CurrentPage].HtmlString) -
length(DRP.DicomReportPages[CurrentPage].HtmlString) / 5 do
begin
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
s := HTMLDocument.body.outerHTML;
Application.ProcessMessages;
end;


 
nikkie   (2003-10-24 19:00) [1]

обычно используют код
while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages;
можно также отрабатывать событие TWebBrowser.OnDocumentComplete


 
Дмитрий В. Белькевич   (2003-10-25 04:34) [2]

>обычно используют код
> while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
> Application.ProcessMessages;

Не помогает.

>можно также отрабатывать событие TWebBrowser.OnDocumentComplete

Аналогично.


 
nikkie   (2003-10-25 13:15) [3]

>Не помогает.
а что, кому-то нужна помощь?


 
Дмитрий В. Белькевич   (2003-10-26 02:55) [4]

Извини, скажу по-другому:

Делалось это какое-то время назад, я точно не помню, какие глюки были с readystate"ом и событиями, но afair этот код не дожидался окончания загрузки html"а + разные глюки на разных версиях ie (необходима работа 5.0 и выше).

>обычно используют код
> while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
> Application.ProcessMessages;
>можно также отрабатывать событие TWebBrowser.OnDocumentComplete

Кроме того, пробовал обрабатывать некоторые другие события.
После достаточно продолжительного секса пришлось делать так, как сделал:
s := HTMLDocument.body.outerHTML;
while length(s) < length(DRP.DicomReportPages[CurrentPage].HtmlString) -
length(DRP.DicomReportPages[CurrentPage].HtmlString) / 5 do
begin
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
s := HTMLDocument.body.outerHTML;
Application.ProcessMessages;
end;

Искать длину уже загруженного документа и сравнивать с длиной файла на харде. При этом в HTMLDocument.body.outerHTML нет некотрых тэгов, и длина html _примерно_ уменьшается на 20%. Это всё прекрасно работало, пока не стали подсовывать html"ы, в которых много мусора - программа стала виснуть т.к. не может дождаться окончания загрузки, т.к. слишком много тэгов отброшены webbrwser"ом, HTMLDocument.body.outerHTML отличается от оригинального html"а процентов на 50 по длине.
Webbrowser может отдать полную длину либо полный текст html"а.
Спасибо за ответ.


 
nikkie   (2003-10-26 17:19) [5]

я по первому разу в код и не вчитывался...

>Имеем некий html, лежащий локально.
(WebBrowser1.Document as
IPersistStreamInit).Load(TStreamAdapter.Create(ms));

а почему бы не воспользоваться просто Navigate? код, который я привел как раз ставится после Navigate.

мне казалось, что метод IPersistStreamInit::Load - синхронная операция, странно, если после его вызова что еще надо ждать. кстати, удивляет после этого строка
while WebBrowser1.Document = nil do
Application.ProcessMessages;


можно еще загрузить html с помощью IHTMLDocument2::write, IHTMLDocument2::close.


 
Дмитрий В. Белькевич   (2003-10-26 20:40) [6]

>мне казалось, что метод IPersistStreamInit::Load - синхронная >операция,

В том то и дело, что нет - веббровзер возвращает управление программе, а сам грузит html.

>кстати, удивляет после этого строка
>while WebBrowser1.Document = nil do
>Application.ProcessMessages;

Ну, own изврат ;) документ нужно тоже ожидать. Иначе иногда веббровзер вешался.

И тем не менее, как ни странно, все решилось передергивания флага в ondownloadcomplete. Раньше не работало. Правда, я весь код из обработчика еще раньше перенес в отдельную процедуру. Возможно полегчало из-за этого - код обработчика был достаточно большой, а я помню где-то рекомендовали по-возможности в обработчиках событий не задерживаться.

Проверил, кстати, если писать
while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages

то IPersistStreamInit::Load отдает управлнеие раньше, чем полностью загрузит html.
А ondocumentcomplete вообще не происходит на некоторых html"ах (грязных после word"а) под Win 98, ie 5.0.


 
nikkie   (2003-10-27 01:58) [7]

>документ нужно тоже ожидать

с трудом мне верится... судя по предыдущей строке - документ уже существует, ведь это ему делается Load. измениться он, мне кажется, не должен - это по идее должно происходить лишь при открытии смене HTML на PDF, скажем...

>А ondocumentcomplete вообще не происходит на некоторых html"ах (грязных после word"а) под Win 98, ie 5.0.

пришли мне примерчик...

ЗЫ так почему все-таки не Navigate?


 
Дмитрий В. Белькевич   (2003-10-31 18:32) [8]

> пришли мне примерчик...

Отошлю мылом.

ЗЫ так почему все-таки не Navigate?

Html читается с диска, парсится, а затем показывается. Можно, конечно, после парсинга на веник сбрасывать - но это как-то совсем не хорошо, хотя можно попробовать, если совсем уж никак. В принципе, уже почти полегчало. Только вылез совсем чудный глюк - html показывается как plain text. Причем он полностью загружается от <html> до </html>. Можешь что сказать по этому поводу? Глюк вылез под XP SP1(не уверен, но afair был там сервиспак). У меня на XP SP1 всё замечательно. Раньше html у человека совсем не грузился. Я скорее всего понял почему.
Циклился скорее всего на
s := HTMLDocument.body.outerHTML;
while length(s) < length(DRP.DicomReportPages[CurrentPage].HtmlString) -
length(DRP.DicomReportPages[CurrentPage].HtmlString) / 5 do

т.к. length(HTMLDocument.body.outerHTML) никогда не становился больше нуля. Т.к. outeHTML"а собственно никогда не было.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
14-99759
panov
2003-11-03 22:02
2003.12.30
Пара ссылок. Кто дождется, пока закачаются, тот удивится.


1-99594
Брат
2003-12-17 10:41
2003.12.30
Сложный алгоритм


8-99655
Ilya_
2003-08-27 04:53
2003.12.30
Не могу открыть сохранённый в Delphi 3 bmp файл


14-99745
Davron
2003-12-07 16:07
2003.12.30
ColorDlg.dcu


1-99624
GirichevR
2003-12-16 16:44
2003.12.30
...подсветка HTML тэгов в TRichEdit...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский