Имеем основную задачу: отловить события, создаваемые объектом HTMLDocument. Подключаем библиотеку MS HTML Object Library и пытаемся поймать означенные события.
События, по документации, ловятся двумя способами.
Весь приведённый код на Visual Basic 6. Задача – иметь его работающий вариант на .NET. У меня это не получилось
Способ первый
Отлов собственных событий документа
Подходит для тех, кто создаёт документы методом createDocumentFromUrl (предварительно создайте файл "c:\1.htm" и напишите в него "<html><body>Гы!</body></html>").
- Код: Выделить всё
Option Explicit
Private Creator As IHTMLDocument4
Private WithEvents doc As HTMLDocument
Private Sub Form_Load()
Me.AutoRedraw = True
Set Creator = New HTMLDocument
Set doc = Creator.createDocumentFromUrl("c:\1.htm", "null")
End Sub
Private Sub doc_onreadystatechange()
Me.Print doc.readyState
End Sub
При выполнении этого кода на форму выводится сначала interactive, потом complete.
Примечание: я попытался пропустить этот код через Upgrade Wizard. Эти несчастные 11 строчек подвесили его на 10 минут (Pentium-M 1400). Результирующий код не работал.
Способ второй
Использование обработчиков
Для тех, кто берёт откуда-то HTML в виде plain text (например, с сокета), а потом хочет его парсить. Преимущество в том, что в этом случае можно скачать только текст, тогда как createDocumentFromUrl скачает всё, со всеми картинками и флэшками.
Замечания по этому коду:
Во-первых, имеется класс по имени DocWaiter. В нём метод (его имя не имеет значения, главное, чтобы это была SUB без параметров). Через Tools Procedure Attributes этому методу установлен Procedure ID: (Default). Тогда HTMLDocument понимает, что нужно вызвать именно его.
Во-вторых, CallByName используется потому, что прямой вызов метода write не получится, т.к. он описан в библиотеке типов таким образом, что VB с ним работать не может. А при вызове через IDispatch всё прокатывает (вместо CallByName можно использовать каст к Object – но это кому что нравится). В .NET делать этого не нужно, поскольку он сможет вызвать write и напрямую.
В форму:
- Код: Выделить всё
Option Explicit
Private WithEvents doc As HTMLDocument
Private watcher As DocWaiter
Private Sub Form_Load()
Dim t As IHTMLDocument2
Me.AutoRedraw = True
Set doc = New HTMLDocument
Set watcher = New DocWaiter
doc.onreadystatechange = watcher
Set t = doc 'cast to IHTMLDocument2
CallByName t, "write", VbMethod, "<html><body>Гы!</body></html>"
t.Close
End Sub
В класс по имени DocWaiter:
- Код: Выделить всё
Option Explicit
Public Sub AnyName() 'Procedure ID: (Default)
MsgBox "!"
End Sub
Любой из этих методов (лучше второй) (а желательно оба) хочу видеть в .NET