В этой статье пойдёт речь об использовании лежащего в основе Internet Explorer элемента управления WebBrowser, и библиотеки Microsoft HTML Object Library (MSHTML). Имеет смысл рассказывать о них именно в связке, так как главная функция WebBrowser - отображать HTML документы, а MSHTML описывает и управляет структурой этих документов.
Результат использования WebBrowser для создания интерфейса можно оценить на примере vb-программы PharmGuide надстройки Excel DataExtract
Для подключения браузера необходимо открыть меню Project / Components и выбрать компонент 'Microsoft Internet Controls' соответствующий файлу shdocvw.dll. В VBA проектах он называется 'Oбoзpeвaтeль вeб-cтpaниц (Microsoft)'.
Если вы намерены использовать в программе возможности динамического html - необходимо подключить библиотеку MSHTML. Меню Project / References и выбрать компонент 'Microsoft HTML Object Library' соответствующий файлу MSHTML.TLB.
Оба файла входят в состав всех версий Windows и существенных проблем с переносимостью кода быть не должно.
Элемент управления WebBrowser предназначен для отображения html документов. Существует несколько способов определить содержимое этого документа.
В зависимости от источника документа используя различные протоколы:
Есть и другие протоколы: HTTPS, FTP, ALP, MAILTO, MK. Последний используется в файлах справки (chm).
протокол about: прежде всего известен в качестве пустой страницы загрузки about:blank. На самом деле это не пустая страница. Она имеет вполне определённый адрес: res://mshtml.dll/blank.htm
К сожалению некоторые программы могут подменять этот адрес и в результате вместо быстрой загрузки пустого документа будет происходить долгая загрузка некой страницы из интернет. Для предотвращения этого можно напрямую вызывать эту страницу. Важным свойством этого протокола является возможность загрузки небольших html документов непосредственно из адресной строки.
Вот самый простой пример использования браузера.
Private Sub Form_Load()
WebBrowser1.Navigate App.Path & "\sample.htm"
End Sub
Вот пример загрузки данных из ресурсов:
Private Sub Form_Load()
WebBrowser1.Navigate "res://shdoclc.dll/about.dlg"
End Sub
Использование протокола 'about'
Private Sub Form_Load()
WebBrowser1.Navigate "about:<b>привет</b>"
End Sub
Данные, загружаемые из ресурсов должны находиться в разделе 'HTML'
Существует и нестандартный способ загрузки страницы при старте программы. Для этого необходимо открыть файл frmMain.frm и найти в разделе 'Begin SHDocVwCtl.WebBrowser WebBrowser1' строку 'Location = ""'. Это путь к документу, по умолчанию. Если его заменить на 'Location = "about:<b>привет</b>"', то слово 'привет' будет автоматически отображаться в браузере, даже в режиме конструктора.
Способ основан на использовании динамического html, поэтому в состав проекта необходимо включить библиотеку mshtml. Для начала необходимо создать новый объект Document, а затем воспользоваться методом Write.
Private Sub Form_Load()
Dim mStr As String
Dim mDoc As MSHTML.IHTMLDocument
'загрузка простого документа
WebBrowser1.navigate "res://mshtml.dll/blank.htm"
While WebBrowser1.document Is Nothing
'ждём создания документа
DoEvents
Wend
Set mDoc = WebBrowser1.document
mStr = "<html><body><b>привет</b></body></html>"
'меняем содержание всего документа
mDoc.Write mStr
Set mDoc = Nothing
End Sub
Для вывода информации не обязательно загружать новый файл. Есть возможность добавлять новые элементы документа или изменять существующие. Сначала необходимо получить элемент содержание которого надо поменять. Для этого существует множество способов. Удобнее всего обращаться к элементу по его уникальному идентификатору.
Ex: 'mDoc.all.Table1' или 'mDoc.getElementById("Table1")'
Если нет идентификатора, можно использовать метод getElementsByTagName
Ex: 'mDoc.getElementsByTagName("body").Item(0)'.
После того, как нужный элемент получен - можно менять его свойства и использовать его методы. Для добавления html кода используется свойство 'InnerHtml', для добавления текста - 'InnerText'. Для некоторых элементов удобнее пользоваться специальными методами. Например, использовать 'insertRow' для добавления новых строк в таблицу. Информацию об этих других свойствах и методах можно получить в msdn.
Private Sub Form_Load()
Dim mStr As String
Dim mDoc As MSHTML.IHTMLDocument
Dim mDiv As MSHTML.HTMLDivElement
'загрузка простого документа
WebBrowser1.navigate "res://mshtml.dll/blank.htm"
While WebBrowser1.document Is Nothing
'ждём создания документа
DoEvents
Wend
Set mDoc = WebBrowser1.document
mStr = "<html><body><div id=num1></div></body></html>"
'меняем содержание всего документа
mDoc.Write mStr
'получаем элемент div по его идентифекатору
Set mDiv = mDoc.All.num1
'меняем содержание div
mDiv.innerHTML = "<b>привет</b>"
Set mDiv = Nothing
Set mDoc = Nothing
End Sub
Найти эти документы можно через поисковики
В следующей статье речь пойдёт о перехвате и обработке событий в html документах.