Диалоговые HTML-окна в программе на Delphi

Источник: delphiplus
Альберт Мамедов

Использование HTML диалоговых окон позволяет:

  • значительно расширить функциональность диалоговых окон программы;
  • получать и передавать информацию непосредственно из НТМL страниц расположенных в Интернете;
  • осуществлять предварительную обработку информации в диалоговом окне;
  • использовать богатые возможности скриптовых языков (JavaScript, VBScript).

Все элементы управления в таких окнах описываются HTML кодом. В библиотеке mshtml.dll. А для создания диалоговых HTML окон реализована специальная функция ShowHTMLDialog.

Богатые возможности Delphi позволяет минимальным кодом создавать такие окна.

Для использования определяем эту функцию:

function ShowHTMLDialog(hwndParent:HWND;
    pMk:     IMoniker;
    pvarArgIn:pVARIANT;
    pchOptions: PWCHAR;
    varArgOut:pVARIANT):hresult;
            stdcall; external 'mshtml.dll';

Аргументы функции:

  • hwndParent - дескриптор родительского окна;
  • pMk - указывае на интерфейс IMoniker, который идентифицирует HTML - код, выводимый в диалоговое окно;
  • pvarArgIn - содержит входные данные для диалогового окна, которые функция присваивает свойству dialogArguments;
  • pchOptions - набор параметров описывающих размеры и положение относительно рабочего стола;
  • varArgOut - содержит выходные данные диалогового окна возвращаемые через returnValue.

Для создания моникера подключаем модуль UrlMon и используем функцию CreateURLMoniker. Сам HTML-код, на который ссылается моникер, находиться в ресурсе или внешнем файле.

Вся обработка действий пользователя внутри диалогового окна производиться в сценариях на HTML.

Рассмотрим пример использования HTML диалогового окна.

  • для размещения HTML- кода в внешнем файле:
    var   s:hresult;
      outm:imoniker;
      url:pwidechar;
      InParam: Variant;
      OutParam: Variant;
      path:string;

    begin   path:= GetCurrentDir+'\HTMLDlg.htm';// определяем путь к файлу HTML диалогавого окна
      url:=StringToOleStr(path);
      s:=createurlmoniker(nil,url,outm); //создаём моникер
      TVarData(InParam).VType:=varOleStr;// определяем тип передаваемых данных
      TVarData(InParam).VOleStr:=StringToOleStr('Проба 1,Проба 2,Argument 2,Argument 3,Argument 4, Pleasant discussion 1');
    // присваиваем данные разделённые разделителем определённым в скрипте HTML-кода
      ShowHTMLDialog(Handle,outm,@InParam,'dialogWidth:25;dialogHeight:24;dialogTop:50;center:no;',@OutParam);
      InParam:=0;
    //обнуляем выходную переменную
      if VarType(OutParam)=varOleStr then
        MessageDlg('Выходные данные '+OutParam,mtInformation,[mbOK],0)   else
        MessageDlg('Данных нет',mtInformation,[mbOK],0);
    end

  • для размещения HTML-кода в ресурсе изменяем только
    url:=StringToOleStr('res://'+application.ExeName+'/RT_HTML/HTML_RESOURCE');
    и не забываем подключить ресурс {$R html.res}.

С Delphi кодом программы разобрались, рассмотрим JavaScript программу диалогового окна. Размещаем на HTML странице необходимые элементы управления.

<BODY onload="loadBody()" BGCOLOR="Teal" TEXT="White">
<SELECT NAME="ArgumentList"></SELECT><P>
<INPUT type=BUTTON value="OK" id="okButton" onClick="okButtonClick()" >
<INPUT type=BUTTON value="Cancel" id="cancelButton" class=button onClick="cancelButtonClick()" >
</BODY>

Определяем необходимые функции на JavaScript

<SCRIPT language="JavaScript">
function loadBody()
{ //
получаем значение передаваемого аргумента
var arrArgs = new Array();
arrArgs = window.dialogArguments.split(";");//
разделитель
//очищаем элемент управления Select
ArgumentList.options.length = 0;
/
/добавляем значение в элемент управления Select
var index;
index = 0;
while(index < arrArgs.length)
{
var tempOption = new Option(arrArgs[index]);
ArgumentList.options[ArgumentList.options.length] = tempOption;
index++;
}
//
устанавливаем отображение 1-го значения
ArgumentList.options[0].selected = true;
//устанавливаем default return value
window.returnValue = 0;
}

function okButtonClick()
{
/
/присваиваем возвращаемое значение
window.returnValue = ArgumentList.options[ArgumentList.selectedIndex].text;
/
/закрываем окно
window.close();
}

function cancelButtonClick()
{
window.returnValue = 0;
window.close();
}
</SCRIPT>

При открытии диалогового окна элемент Select заполняется переданным значением аргумента. При нажатии кнопки OK свойству window.returnValue присваивается значение выбранного положения Select и окно закрывается.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=20907