Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Работает криво Document.Images.Count


Автор: Rustemka 9.12.2006, 23:10
Здравствуйте. Имеем скаченную страницу на жестком диске (html).
Код

dim fname as string
Dim wb As New WebBrowser
fname="c:\test.htm"
wb.Navigate(fname)
'А теперь самое интересное. Пытаемся определить количество картинок в странице
MsgBox((wb.Document.Images.Count))
'и если закоментировать строку выше, то нифига не работает
       Dim j As Integer
        j = wb.Document.Images.Count
        Dim j1 As Integer
        For j1 = 0 To j - 1
           msgbox = wb.Document.Images.Item(j1).OuterHtml.ToString
        next j1

Почему так работает код? Как заставить его нормально функционировать "не вызывая" вначале msgbox, методы debug.print и trace.write тоже не помогают. Почему то вначале нужно вызвать "сколько в документе images", msgbox покажет что ноль, а потом переменная j покажет реальное значение !!!
Почему? Что за "косяк" у микрофоста в WebBrowser?

Автор: DarkDragon 10.12.2006, 10:52
Цитата(Rustemka @  9.12.2006,  23:10 Найти цитируемый пост)
Почему? Что за "косяк" у микрофоста в WebBrowser? 

Сам ты косячешь smile 
мелкософтцы молодцы!

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

Код

Private Sub OverLoad (sender as object, e as EventArgs)
         Dim j As Integer
        j = wb.Document.Images.Count
        Dim j1 As Integer
        For j1 = 0 To j - 1
           msgbox = wb.Document.Images.Item(j1).OuterHtml.ToString
        next j1
End Sub

AddHandler webBrowser1.Navigated, AddressOf OverLoad // Установи обработчик события в конструкторе, после InitalizeCom..


Теперь после каждого Navigate, ты получишь точную информацию об элементах в документе smile 

Автор: DarkDragon 10.12.2006, 11:14
Еще можно через ReadyState(тогда не нужно устанавливать обработчик события Navigated):
просто добавляем цикл, который завершится после полной загрузки страницы.

Код

   While (webBrowser1.ReadyState.ToString() = "Loading")
      Application.DoEvents() ' Это что бы все работало, а то зависнет!
   End While
   Me.Text = webBrowser1.Document.Images.Count.ToString() ' Смотрим сколько картинок, здесь же можешь ставить свой цикл


Добавлено @ 11:21 
 smile 
Цитата(DarkDragon @  10.12.2006,  10:52 Найти цитируемый пост)
// Установи обработчик события в конструкторе, после InitalizeCom..

А теперь и я косить начел smile Коментарии та я поставил от C#  smile 

Автор: Rustemka 10.12.2006, 12:58
Спасибо большое
1. А что в моем первом варианте делал Msgbox , почему он "помогал" и с ним работала программа?
2. И если wb.Navigate(fname) выделить в отдельный поток Thread, он будет "вешать" программу пока не загрузит страницу, или можно сделать много потоков и они Независимо будут загружать страницы (из интернета). Или надо запускать много программ одновременно?
Жалко а то оперативную память. По 30 Мбайт каждый запуск потребляет!

Автор: DarkDragon 10.12.2006, 15:06
Цитата(Rustemka @  10.12.2006,  12:58 Найти цитируемый пост)
1. А что в моем первом варианте делал Msgbox , почему он "помогал" и с ним работала программа?

MsgBox вызывается модальным способом (т. е. блакирует форму из которой он был вызван), в это время WebBrowser успешно загружает страницу, а после того как ты закроешь MsgBox, следом идет загрузка изображений, которые уже загрузились в Document.

Цитата(Rustemka @  10.12.2006,  12:58 Найти цитируемый пост)
. или можно сделать много потоков и они Независимо будут загружать страницы (из интернета). Или надо запускать много программ одновременно?

Вряд ли можно запустить несколько потоков для одного wb, т. к. они все будут обращаться к одной и той же ф-ции, которая разбирает, загружает страницу в одно и то же место и выресовывает её на одну и ту же форму(контрол), и скорее всего получишь класную ошибку, или фигню какую нибудь. Так что грузи много програм, или вместе с потоками создавай столько же webbrowser'ов, и каждый из них пусть загружает свою страницу.

Но странно для чего же тебе это надо?

Автор: Rustemka 10.12.2006, 22:14
Картинки смотреть :-)

Думаешь в нескольких потоков несколько веб браузеров не будет тормозить?
Если я сделаю и несколько окон, ну к примеру 5 потоков, и 5 окон нарисую?

Автор: DarkDragon 11.12.2006, 07:50
Цитата(Rustemka @  10.12.2006,  22:14 Найти цитируемый пост)
Думаешь в нескольких потоков несколько веб браузеров не будет тормозить?
Если я сделаю и несколько окон, ну к примеру 5 потоков, и 5 окон нарисую? 


Возможно будет! Это все уперается в: производительность твоего компа, производительность ОС (можно так забить ОС всяким хламом, что он будет туга работать, ну и не всегда хламом, вообщем сервисы, драйвера, реестр, и т. д.), интернет соединение, ну и как программа будет работать.

Вроде же спокойно грузит IE в нескольких окошках. А ты в TabPage зделай smile И пускай в одной программе грузится.
Если будешь использовать потоки вместе с несколькими wb, используй метод обработки собыйтий (Navigated), это будет легче, и системизированней, нежели второго примера smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)