Програмування

Нотатки з використання компонента TWebBrowser у Delphi 7

Спочатку я почав використовувати компонент TWebBrowser для відображення розділу довідки у своїх програмах. У цьому випадку все зовсім просто: кладемо звичайні html-файли в папку й за потреби викликаємо щось на кшталт WebBrowser.Navigate(HelpDir + ‘index.html’);
А сам html уже містить усе, що душа забажає: зображення, перехресні посилання та скрипти, доступні InternetExplorer.

Усе стало набагато цікавішим, коли я захотів за його допомогою відображати інформацію з бази даних, а також програмно змінювати відображувану сторінку. Як виявилося, усе це теж можливо.

Додавання CSS виконується стандартним для вебу способом, наприклад вставленням перед body:

<style type="text/css">
table {border-collapse: collapse; border-color: #E0E0E0; font-size:x-small;}<br />  td { border: 1px solid; padding: 2px; }<br /></style>

Відображення довільного html-рядка який передається в TWebBrowser. Це робиться приблизно так:

var
	Doc: Variant;
begin
	if NOT Assigned(wBrowser.Document) then
	wBrowser.Navigate('about:blank');
	Doc := wBrowser.Document;
	Doc.Clear;
	Doc.Write('Hello World');
	Doc.Close;
end;

Прокручування сторінки до кінця одразу після завантаження. Виявилося, що це можна зробити, додавши JavaScript у кінець сторінки (можна після body):

<script>window.scrollTo(0,document.body.scrollHeight);</script>

Виконання довільного JavaScript-коду:

var
	Doc: Variant;
begin
	if NOT Assigned(wBrowser.Document) then
	wBrowser.Navigate('about:blank');
	Doc := wBrowser.Document;
	Doc.parentWindow.execScript('alert("Hello World");', 'JavaScript');

Отримати значення атрибута можна приблизно так:

function GetElementIdValue(WebBrowser: TWebBrowser; TagName, TagId, TagAttrib: string):string;
var
	Document: IHTMLDocument2;
	Body: IHTMLElement2;
	Tags: IHTMLElementCollection;
	Tag: IHTMLElement;
	I: Integer;
begin
	Result:='';
	if not Supports(WebBrowser.Document, IHTMLDocument2, Document) then
		raise Exception.Create('Invalid HTML document');
	if not Supports(Document.body, IHTMLElement2, Body) then
		raise Exception.Create('Can''t findelement');
	Tags := Body.getElementsByTagName(UpperCase(TagName));
	for I := 0 to Pred(Tags.length) do begin
		Tag:=Tags.item(I, EmptyParam) as IHTMLElement;
		if Tag.id=TagId then Result := Tag.getAttribute(TagAttrib, 0);
	end;
end;

// ПРИКЛАД ВИКОРИСТАННЯ функції:
Result := GetElementIdValue(WebBrowser1, 'input', 'result', 'value');

І нарешті найцікавіше: як із коду JavaScript на сторінці передати подію або інформацію в код Delphi? Для цього можна скористатися переходом за посиланням усередині HTML і перехопленням цієї події в обробнику OnBeforeNavigate2, після чого розібрати URL та витягти з цього рядка потрібну інформацію. Звісно, не забудьте “Cancel := true;”, якщо не потрібно, щоб браузер переходив за цим посиланням. Для такого способу передавання інформації та подій краще передбачити спеціальний префікс в адресі, за наявністю якого визначати, чи потрібно переходити. Приклад обробника:

procedure TMyForm.WebBrowserBeforeNavigate2(Sender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool);
var
	pre: string;
	p: Integer;
begin
	p := pos(':', URL);
	if p > 0 then begin
		pre := Copy(URL, 1, p-1);
		if pre = 'event' then begin
			ShowMessage(Copy(URL, p+1, length(URL)-p));
			Cancel := TRUE;
		end;
	end;
end;

Сам код, який передає сюди інформацію, може бути, наприклад, таким:

<input id="testButton" type="button" value="test" />

P.S. Недолік такого способу відображення полягає в тому, що якщо програма виконується, скажімо, на сервері терміналів із суворими обмеженнями, то під час ініціалізації вікна з TWebBrowser користувач побачить вікно Internet Explorer із причинами блокування. Щоправда, у ньому часто можна додати (Add) застосунок до винятків.

Залишити коментар

Вашу електронну адресу не буде оприлюднено. Обов’язкові поля позначено *