Спочатку я почав використовувати компонент 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) застосунок до винятків.
