TWebBrowser, OleObject и его свойства

В качестве логического расширения к предыдущей заметке про кукисы 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

 

 

 


Перейти на Главную