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

Показаны сообщения с ярлыком TWebBrowser. Показать все сообщения
Показаны сообщения с ярлыком TWebBrowser. Показать все сообщения

четверг, 10 марта 2011 г.

Delphi: Как удалить cookies из TWebBrowser?

В этой статье не будет ничего скандально нового :) Просто уже 2 комментатора спросили в заметке о cookies в TWebBrowser, как их удалять. В гугле, ясно дело, решение найти просто, но почему-то для кого-то проще спросить и ждать :)

В общем, если на мой блог о парсинге приходят по этому запросу, то надо на него ответить. :)

Это готовое решение, взятое из инета и опробованное мной. В результате будут подчищены все файлы с куками, хранящиеся в c:\Documents and Settings\Имя_пользователя\Cookies.

uses
WinInet;

procedure DeleteIECache;
var
lpEntryInfo: PInternetCacheEntryInfo;
hCacheDir: LongWord;
dwEntrySize: LongWord;
begin
dwEntrySize := 0;
FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
GetMem(lpEntryInfo, dwEntrySize);
if dwEntrySize > 0 then lpEntryInfo^.dwStructSize := dwEntrySize;
hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize);
if hCacheDir <> 0 then
begin
repeat
DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
FreeMem(lpEntryInfo, dwEntrySize);
dwEntrySize := 0;
FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize);
GetMem(lpEntryInfo, dwEntrySize);
if dwEntrySize > 0 then lpEntryInfo^.dwStructSize := dwEntrySize;
until not FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize);
end;
FreeMem(lpEntryInfo, dwEntrySize);
FindCloseUrlCache(hCacheDir);
end;


Для чего может пригодиться очистка кукисов? Ну, например, вы написали какое-то свое приложение с TWebBrowser и заходите на определенный сайт через список прокси... ;)
___

Сегодня объявляю гранд мерси akkadites, автору блога "Обзор полезного софта", и Seorit.ru за обзоры RSSAdder-а.
___
Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

четверг, 3 сентября 2009 г.

Работа с формами в TWebBrowser

Эта статья — своеобразное логическое продолжение статьи об OleObject в TWebBrowser, переведенная мной. В ней содержится информация о том, как получить доступ к данным о формах, расположенных на странице в TWebBrowser, и к элементам этих форм.

Основные вопросы, которые будут освещены:

Получение количества форм на странице
Обращение к форме по порядковому номеру
Получение имени формы
Получение доступа к форме по имени
Получение списка имен всех элементов формы
Получение value элемента формы (по name элемента)
Установка value элемента формы (по name элемента)
Сабмит формы


В листинге примеров, приведенных в этой статье, компонент TWebBrowser, в который загружаются страницы, на форме называется WebBrowser. Для работы с интерфейсами, приведенными в листингах, подключите библиотеку MSHTML.

вторник, 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.

понедельник, 6 апреля 2009 г.

Как установить фокус на TWebBrowser (SetFocus не работает)

Статью-продолжение из цикла постов о работе с Indy еще не дописала. Так что сегодня хочу привести здесь один из "рецептов" для работы с компонентом TWebBrowser.

Как правило, при написании приложений всплывают какие-нибудь специфические вопросы. Эти вопросы легко решить с помощью интернета :) Вот, например, недавно, при отладке очередной программы обратила внимание, что не работает SetFocus применительно к объекту WebBrowser. Погуглила, нашла решение (даже 2).


{1}

uses
ActiveX;

begin
WebBrowser1.Navigate('irgendeinedatei.html');
with WebBrowser1 do
if Document <> nil then
with Application as IOleobject do
DoVerb(OLEIVERB_UIACTIVATE, nil, WebBrowser1, 0, Handle,
GetClientRect);
end;

{2}

uses
MSHTML;

begin
WebBrowser1.Navigate('irgendeinedatei.html');
repeat
Application.ProcessMessages;
until WebBrowser1.ReadyState >= READYSTATE_COMPLETE;
if WebBrowser1.Document <> nil then
(Webbrowser1.Document as IHTMLDocument2).ParentWindow.Focus;
end;


Выбрала второе, так как оно показалось мне более простым :) Однако, в нем обнаружился недостаток, который, видимо, не на всех формах можно обнаружить. У меня на форме в верхней части расположен грид, а в нижней - WebBrowser.

TWebBrowser setfocus

После установления фокуса на WebBrowser начинаю скроллить мышь над ним. Все идет гладко до тех пор, пока не достигается конец (или начало — в зависимости от того, в какую сторону скроллить) документа. После этого начинает скроллиться грид, который расположен над документом. Использование варианта под номером {1} устранило этот недочет.

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

среда, 18 февраля 2009 г.

Как вызывать функции JavaScript на странице, загруженной в TWebBrowser в Delphi

Немного теории для тех, кто осваивает возможности Delphi при работе с интернетом.

Как вызвать функцию JavaScript на странице в TWebBrowser-е.

Зачем нам это может пригодиться при парсинге? Примеров может быть много, причем совершенно разноплановых. Приведу один.

парсинг страницы с AJAX
Сейчас на некоторых сайтах активно используется AJAX. Рассмотрим ситуацию, когда на веб-странице расположены несколько объектов SELECT. При первой загрузке страницы активен только первый. После выбора определенного OPTION-а без перезагрузки страницы формируется набор значений для второго SELECT-а и он становится активным. И так далее. Если просто присвоить свойству selected (iOption.selected := true;) одной из записей набора OPTIONS значение true, то JavaSctript, повешенный на onchange этого селекта, не сработает. Скрипт надо явно запустить.

Итак, решение. У объекта типа IHTMLWindow2, который представляет собой экземпляр HTML-документа, для наших целей есть метод execScript. Ему надо передать 2 строковых параметра:

1 — непосредственно строка вызова функции;
2 — язык, который используется (у нас — JavaScript).

Получить объект окна просто. Подключаем библиотеку MSHTML, объявляем переменные типов IHTMLDocument2, IHTMLWindow2.

uses
..., MSHTML;

Doc : IHTMLDocument2;
HTMLWindow : IHTMLWindow2;


Для получения объекта IHTMLWindow2 используем свойство parentWindow у объекта Document браузера (после того, как документ полностью загрузится).

WebBrowser.Document.QueryInterface(IHTMLDocument2, Doc);
HTMLWindow := Doc.parentWindow;


Перед тем, как дальше с полученным объектом, надо проверить, ассигновался ли он вообще:

if not Assigned(HTMLWindow) then Exit;


В качестве примера привожу листинг отдельной процедуры. Она в заданном SELECT-е (SelectEl) выбирает OPTION с определенным текстом (TextStr). И запускает JavaScript, повешенный на onchange селекта. Саму по себе, без контекста, вы ее не запустите, но синтаксис будет понятен.

procedure TMainF.SelectItemByTextFromSelectEl(TextStr: string;
SelectEl: IHTMLSelectElement; SelectName: string);
var
i, t : integer;
iDisp : IDispatch;
iColl : IHTMLElementCollection;
iOption : IHTMLOptionElement;
JSFStr : string;
begin
iDisp := SelectEl.tags('OPTION');
iDisp.QueryInterface(IHTMLElementCollection, iColl);
if not Assigned(iColl) then
begin
ShowMessage('Not assigned!'); exit;
end;

i := 0;
while i <= iColl.length-1 do
begin
iDisp := iColl.item(i,0);
iDisp.QueryInterface(IHTMLOptionElement, iOption);
if Assigned(iOption) then
begin
if iOption.text = TextStr then
begin
iOption.selected := true;
if not Assigned(HTMLWindow) then Exit;
try
JSFStr := 'setTimeout(''__doPostBack(\''' + SelectName + '\'',\''\'')'', 0)';
HTMLWindow.execScript(JSFStr, 'JavaScript'); // вызов функции
except
end;

for t := 0 to WaitPause-1 do
begin
Sleep(1000); Application.ProcessMessages;
end;
break;
end;
end;
inc(i);
end;

end;

Не забывайте про экранирование эскейп-символов при помощи обратных слешей. Если в функцию надо передавать какие-либо параметры, то при подготовке строки с вызовом функции удобно пользоваться Format-ом.

JSFStr := Format('Foo("%s",%d)', [S, I]);


Следует отметить, что метод execScript предназначен для запуска функций, которые не возвращают значения, или таких функций, у которых нам возвращаемое значение не нужно.


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

понедельник, 12 января 2009 г.

Как запретить окна "Script Error" в TWebBrowser

Хозяйке на заметку :)
How to Suppress / Disable Script Errors in WebBrowser ControlБывает, что в жизни случается всякая фигня, например, при работе в TWebBrowser внезапно вылазят сообщения об ошибках сценария. Наглядный пример — слева. Убрать/предотвратить появление этих сообщений можно так:
WebBrowser.Silent := true;


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

четверг, 28 августа 2008 г.

Получение содержимого web-страниц в Delphi. Вариант первый, самый простой

Пытаюсь излагать все последовательно и небольшими порциями. Повторюсь: рассчитываю, что по моим инструкциям начать работу над собственным парсером смогут даже новички.

Сегодня опишу самый простой способ получить содержимое web-страницы. Для этого будем использовать стандартный Active-X компонент TWebBrowser. Этот же компонент использует Windows в своем IE. В некоторых случаях это даже удобно, так как созданный на основе этого компонента объект будет "видеть" все ваши IE-кукисы и прочие настройки (если, конечно, вы пользуетесь IE).

Итак, создадим форму, на нее поместим TEdit (подобие адресной строки), кнопку и компонент TWebBrowser (вкладка Internet).


В обработчике нажатия кнопки пишем:
WebBrowser1.Navigate(Edit1.Text);

Вот и все!

Simple Browser
Этот компонент удобен в случаях, когда HTML-код страницы нельзя получить другим простым способом (например, некоторые сайты отказываются работать, когда браузер не поддерживает flash, поэтому получить код страницы в обход применения этого компонента — возможности нет). Также TWebBrowser удобен для автоматизации работы с формами на сайтах.

Иногда требуется, чтобы страница полностью отобразилась в контейнере, прежде чем продолжится работа с ней. В этом случае я обычно в проекте создаю глобальную переменную, на событие OnDocumentComplete вешаю обработчик:
procedure TFMain.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
DocLoaded := true;
end;

А в теле основного модуля работа продолжается только тогда, когда эта глобальная переменная станет равна true:
procedure TFMain.PostMessageOnBoard(Mess: string);
var
Doc : IHTMLDocument2;
S : string;
begin
DocLoaded := false;
WebBrowser1.Navigate(Edit1.Text);
while DocLoaded = false do
Application.ProcessMessages;

Doc := WebBrowser1.Document as IHTMLDocument2;
WebBrowser1.OleObject.document.getElementById('shform').ClassName := '';

S := Doc.body.innerHTML;

//...
end;

Кстати, в приведенном выше отрезке кода содержится пример использования объектной модели браузера. (Что это — я расскажу позже.) А в переменной S в результате окажется весь HTML-код страницы.

В ближайших постах я планирую рассказать:
  • Что такое объектная модель браузера и с чем ее едят?
  • Как еще можно получить содержимое страницы?
  • Написание простенького парсера (Пример №1 - Парсинг ключевых слов).
Так что подписывайтесь на RSS :)

Поделиться