В качестве
логического расширения к предыдущей заметке про кукисы
TWebBrowser-а решила поместить на блоге описание
свойств OleObject-а. Чтобы картина получилась наиболее полной, переведу статью,
по которой я сама когда-то знакомилась с OleObject-ом
(плюс, если найдет озарение, помещу свои комментарии).
Итак, свойства OleObject-а TWebBrowser-а.
OleObject
— удобный инструмент для работы с "внутренними объектами" компонента TWebBrowser.
Все, доступное через свойство OleObject, является
также доступным через свойство Document. В целом
получение данных через Document является более
сложным, поскольку оно связано с использованием других классов/интерфейсов, но
этот путь лучше с точки зрения удобства выявления ошибок.
Здесь будет приведена не полная документация по OleObject-у, а только описание
некоторых полезных атрибутов, наиболее часто встречающихся при работе (код,
представленный в листингах, — просто для иллюстрации).
Итак, атрибуты объекта, о которых пойдет речь ниже:
WebBrowser.OleObject.Document
WebBrowser.OleObject.Document.All
WebBrowser.OleObject.Document.bgColor
WebBrowser.OleObject.Document.Body.Style.overflowX
WebBrowser.OleObject.Document.Body.Style.overflowY
WebBrowser.OleObject.Document.Body.Style.zoom
WebBrowser.OleObject.Document.cookie
WebBrowser.OleObject.Document.documentElement.innerHTML
WebBrowser.OleObject.Document.documentElement.innerText
WebBrowser.OleObject.Document.FileSize
WebBrowser.OleObject.Document.Forms
WebBrowser.OleObject.Document.Frames
WebBrowser.OleObject.Document.Images
WebBrowser.OleObject.Document.LastModified
WebBrowser.OleObject.Document.Links
WebBrowser.OleObject.Document.Location.Protocol
WebBrowser.OleObject.Document.ParentWindow
WebBrowser.OleObject.Document.ParentWindow.ScrollBy(iX: Integer; iY: Integer)
WebBrowser.OleObject.Document.selection
WebBrowser.OleObject.Document.Title
WebBrowser.OleObject.Document.URL
WebBrowser.OleObject.Document
Обеспечивает доступ к отображаемому документу.
Эквивалентная запись:
WebBrowser.Document as IHTMLDocument2
Примечание:
* Если документ не был загружен, то WebBrowser.Document as IHTMLDocument2
будет равно nil. Для того,
чтобы предотвратить возникновение исключения, перед использованием нужно
проверить значение, например:
var
document: IHTMLDocument2;
begin
document := WebBrowser.Document as IHTMLDocument2;
if Assigned(document) then
...
...
* В дальнейшем в этой статье для краткости такая проверка будет опускаться, но
при разработке приложений надо о ней помнить.
WebBrowser.OleObject.Document.All
Массив всех элементов/объектов документа. Он включает в себя изображения,
ссылки, текст и т.д.
Таблица свойств массива:
.Length |
Возвращает количество
элементов в массиве. |
.Item(0) |
Возвращает первый элемент
документа. |
.Item(n).InnerText |
Чтение/запись текста между
начальными и конечным тегами конкретного элемента. |
.Item(n).ScrollIntoView (bAlignToTop:
Boolean) |
Выполняет прокрутку
документа, содержащего n-ый элемент, пока верхний
или нижний край элемента не окажется выровненным с окном документа. bAlignToTop = true выравнивает
элемент с верхним краем окна, а bAlignToTop = false — с нижним краем окна. |
Листинг части кода, демонстрирующий работу с элементами документа (в частности
— получение доступа к первому элементу):
var
document: IHTMLDocument2;
docAll: IHTMLElementCollection;
firstElement: IHTMLElement;
begin
document := WebBrowser.Document as IHTMLDocument2;
if Assigned(document) then
begin
docAll := document.all;
firstElement := docAll.Item(0,'');
WebBrowser.OleObject.Document.bgColor
Устанавливает (или возвращает) цвет фона документа. Например, чтобы
установить белый цвет фона, достаточно написать:
WebBrowse.OleObject.Document.bgColor := '#FFFFFF';
WebBrowser.OleObject.Document.Body.Style.overflowX
Чтение/установка строкового значения, определяющего свойство горизонтальной
прокрутки. Значения параметра могут быть следующими:
visible |
Значение параметра по
умолчанию. Без скроллбара. Отображаемый документ
обрезается до видимой области. |
scroll |
Прокрутка всегда видна.
Независимо от того, требуется она или нет. |
hidden |
Прокрутки нет. Содержание
вне зоны видимости скрыто. |
auto |
Содержимое обрезается и
прокрутка появляется в том случае, если это необходимо. |
WebBrowser.OleObject.Document.Body.Style.overflowY
Параметр аналогичен WebBrowser.OleObject.Document.Body.Style.overflowX,
только относится к вертикальной прокрутке.
WebBrowser.OleObject.Document.Body.Style.zoom
Устанавливает или возвращает коэффициент масштабирования, используемый
для отображения документа. По умолчанию этот значение этого паараметра
равно единице. Чтобы документ отобразися вполовину
"нормального", необходимо установить значение 0,5. Чтобы масштаб
отображаемого документа был в 2 раза больше, нужно, соответственно, установиль данный параметр равным двум.
WebBrowser.OleObject.Document.cookie
Данное свойство возвращает строку, содержащую все кукисы
браузера.
Эквивалент:
var
document: IHTMLDocument2;
cookies: String;
begin
document := WebBrowser.Document as IHTMLDocument2;
if Assigned(document) then
cookies := document.cookie;
Кукисы представлены в строке
в виде:
name = value
Примечание:
* Если имеется больше одной пары "имя=значение",
то эти пары разделяются между собой точкой с запятой (';').
* Некоторые символы могут быть "экранированы".
WebBrowser.OleObject.Document.documentElement.innerHTML
Для документов HTML возвращается все содержимое, включая HTML-теги.
WebBrowser.OleObject.Document.documentElement.innerText
Returns the text content of the document - without any (HTML) formatting. Возвращает текстовое
содержанимое документа - без какого-либо (HTML)
форматирования.
WebBrowser.OleObject.Document.FileSize
Возвращает размер HTML-документа в байтах.
Эквивалентно конструкции:
(WebBrowser.Document as IHTMLDocument2).FileSize
Примечание:
1. Приведенная эквивалентная конструкция возвращает размер файла в виде строки.
2. Выражение будет вызывать исключение, если страница не загружается, или если
файл не доступен в кэше.
WebBrowser.OleObject.Document.Forms
Возвращает коллекцию форм на странице.
.Length |
Возвращает количество форм
в документе. |
.Item(0) |
Возвращает первую форму. |
Эквивалентный код:
var
htmlDoc: IHTMLDocument2;
allForms: IHTMLElementCollection;
firstForm: IHTMLFormElement;
begin
htmlDoc := WebBrowser.Document as IHTMLDocument2;
allForms := htmlDoc.Forms;
firstForm := allForms.Item(0,'') as IHTMLFormElement;
См. также: как
работать с элементами формы (Eng).
WebBrowser.OleObject.Document.Frames
Массив фреймов в документа.
.Length |
Возвращает количество
фреймов в документе. |
.Item(0) |
Возвращает первый фрейм. |
.Item(0).Document |
Возвращает документ,
представленный в первом фрейме. |
.Item(0).Document.URL |
Возвращает адрес первого
фрейма документа. |
Эквивалентная запись:
(WebBrowser.Document as IHTMLDocument2).Frames
Пример получения информации о фрейме (через IHTMLWindow2 или IHTMLDocument2)
var
document: IHTMLDocument2;
ole_index: OleVariant;
doc_all: IHTMLElementCollection;
frame_dispatch: IDispatch;
frame_win: IHTMLWindow2;
frame_doc: IHTMLDocument2;
begin
document := WebBrowser.Document as IHTMLDocument2;
ole_index := 0;
frame_dispatch := document.Frames.Item(ole_index);
if frame_dispatch <> nil then
begin
frame_win := frame_dispatch as IHTMLWindow2;
frame_doc := frame_win.document;
...
...
WebBrowser.OleObject.Document.Images
Массив изображений, содержащихся в документе.
.Length |
Возвращает количество
изображений в документе. |
.Item(0) |
Возвращает первое
изображение. |
.Item(0).Src |
URL первого изображения. |
WebBrowser.OleObject.Document.LastModified
Возвращает дату последней модификации (в виде строки). Официально — в
формате "MM/DD/YY hh:mm:ss", но реально
может быть возвращена в формате в соответствии с
местными региональными настройками.
Эквивалентный код:
var
htmlDoc: IHTMLDocument2;
dateString: String;
begin
htmlDoc := WebBrowser.Document as IHTMLDocument2;
if Assigned(htmlDoc) then
dateString := html_doc.LastModified;
WebBrowser.OleObject.Document.Links
Массив всех ссылок.
.Length |
Возвращает количество
ссылок в документе. |
.Item(0) |
Возвращает первую ссылку. |
.Item(0).href |
Возвращает адрес первой
ссылки. |
.Item(0).Document.TagName |
Возвращает тэг первого
элемента. Для ссылок это всегда "A". |
Эквивалентная запись:
var
htmlDoc: IHTMLDocument2;
allLinks: IHTMLElementCollection;
firstLink: IHTMLElement;
url: String;
begin
htmlDoc := WebBrowser.Document as IHTMLDocument2;
allLinks := htmlDoc.Links;
firstLink := allLinks.Item(0,'') as IHTMLElement;
url := firstLink.toString;
WebBrowser.OleObject.Document.Location.Protocol
Возвращает строку, характеризующую протокол URL-а. Протокол может быть
одним из следующих:
Protocol |
Value |
file: |
Локальные или сетевые
файлы. |
ftp: |
FTP |
gopher: |
Gopher session. |
http: |
HTTP |
https: |
HTTPS |
javascript: |
JavaScript-код. |
mailto: |
Client e-mail. |
news: |
Newsgroup. |
res: |
Resource file. |
telnet: |
Telnet terminal
login. |
WebBrowser.OleObject.Document.ParentWindow
Возвращает (только чтение) ссылку на контейнер окна.
WebBrowser.OleObject.Document.ParentWindow.ScrollBy(iX: Integer; iY: Integer)
Прокрутка окна по горизонтали на 'iX' пикселей:
отрицательное значение параметра приведет к прокрутке влево, положительное —
вправо. Прокрутка на 'iY'
пикселей по вертикали: отрицательное значение — прокрутка вверх, положительное
— вниз.
Эквивалентная запись:
var
document: IHTMLDocument2;
begin
document := webBrowser.Document as IHTMLDocument2;
if Assigned(document) then
document.parentWindow.scrollBy(iX,iY);
Примечание:
1. Окно не будет прокручиваться вверх/вниз, если оно уже достигло своей обычной
верхней/нижней границы. Точно так же не будет происходить прокрутки
влево/вправо, если левая/правая граница достигнута. Так, например, когда
документ впервые загружен, попытка запустить вышеописанную процедуру с
параметрами (-1, -1) ни к чему не приведет.
2. Тут имеются особенности относительно документов, содержащих фреймы.
Прокрутка будет осуществляться только для документа "верхнего
уровня", а не для фреймов, из которых он состоит. Следующая процедура показывает,
как делать прокрутку для любого документа или фрейма, в том числе встроенных
фреймов:
procedure ScrollBrowserWindowBy(const window: IHTMLWindow2; iX:Integer; iY:Integer);
var
index: Integer;
oleIndex: OleVariant;
frameDispatch: IDispatch;
childWindow: IHTMLWindow2;
document: IHTMLDocument2;
begin
if Assigned(window) then
try
window.scrollBy(iX,iY);
// If there are any frames then try scrolling them.
document := window.Document as IHTMLDocument2;
if Assigned(document) then
for index := 1 to document.Frames.Length do
begin
oleIndex := index-1;
frameDispatch := document.Frames.Item(oleIndex);
if Assigned(frameDispatch) then
begin
childWindow := frameDispatch as IHTMLWindow2;
ScrollBrowserWindowBy(childWindow,iX,iY);
end;
end;
except
on E: Exception do begin end;
end;
end;
Еще один пример вызова:
var
document: IHTMLDocument2;
begin
document := webBrowser.Document as IHTMLDocument2;
if Assigned(document) then
ScrollBrowserWindowBy(document.parentWindow,5,10);
3. При попытке вызова scrollBy для
фрейма со страницей с другого сайта, это вызовет исключение "Access Denied", поэтому в
приведенном выше примере надо использовать "try
.. except".
WebBrowser.OleObject.Document.selection
Обеспечивает доступ к выбранной части документа.
Например, для доступа к выделенному в данный момент тексту:
var
document: IHTMLDocument2;
selectionObj: IHTMLSelectionObject;
selectionRange: IHtmlTxtRange;
selectedText: String;
begin
document := WebBrowser.Document as IHTMLDocument2;
selectionObj := document.selection;
selectionRange := selectionObj.CreateRange as IHtmlTxtRange;
selectedText := selectionRange.text;
...
Примечание: приведенный выше пример должен быть
изменен для документов с фреймами.
WebBrowser.OleObject.Document.Title
Название текущего документа. Оно будет пустым, если в
HTML-документе не указан title.
WebBrowser.OleObject.Document.URL
Адрес текущего документа. Это то же самое, что свойство LocationURL.
___
Переводила наспех. Возможно, где-то слажала
или пропустила что-нибудь. Если заметите что-нибудь — напишите, исправлю.
Чтобы быть в курсе обновлений блога,
можно подписаться
на RSS.
TWebBrowser
Использован материал с сайта http://parsing-and-i.blogspot.com/2009/06/twebbrowser-oleobject.html