Альберт Мамедов
Использование 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 и окно закрывается.