Поиск по блогу

вторник, 30 июня 2009 г.

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).SrcURL первого изображения.



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.

воскресенье, 28 июня 2009 г.

Cookies в TWebBrowser

При отладке некоторых программ, где есть TWebBrowser, иногда очень хочется посмотреть кукисы загружаемых страниц. Это очень просто. Я обычно на этот случай помещаю на форму кнопку, видимую в режиме отладки. Сами же кукисы просматриваю, используя свойство объектной модели браузера:

ShowMessage(WebBrowser1.OleObject.Document.cookie);

cookies in TWebBrowser

Результатом WebBrowser1.OleObject.Document.cookie является строка, в которой пары кукисов "имя=значение" разделены ";" (точкой с запятой). Это позволяет легко распарсить строку и получить доступ к значениям кукисов по имени.

Update: ответ на вопросы комментаторов — Как удалить куки из TWebBrowser.
___

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Поделиться