Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Вызов JavaScript функции в HTML документе   Найти похожие ветки 

 
Piter ©   (2005-07-11 14:28) [0]

Итак, у нас есть HTML, загруженный в TWebBrowser.
Как бы вызвать JS функцию TestFunction, реализованную в этом HTMK коде, из Delphi?


 
Alexander Panov ©   (2005-07-11 14:29) [1]

Piter ©   (11.07.05 14:28)
Используй WSH - Windows Script Host.


 
Piter ©   (2005-07-11 14:38) [2]

Alexander Panov, а поподробнее?


 
Piter ©   (2005-07-11 17:58) [3]

?


 
wicked ©   (2005-07-11 18:03) [4]

кусок из реального проекта.... правда, на билдере, но суть должна быть ясна...
const TVarRec *args, int size - это на паскале array of const, вроде...

void __fastcall ExecuteScript(Shdocvw::TWebBrowser * Browser, const AnsiString &fmt, const TVarRec *args, int size)
{
_di_IDispatch _di = Browser->ControlInterface->Document;
DelphiInterface<IHTMLDocument2> doc = _di;
DelphiInterface<IHTMLWindow2> wnd = doc->parentWindow;
AnsiString _script = AnsiString::Format(fmt, args, size);
WideString script = _script;
WideString lang = "JScript";
OleVariant v;
wnd->execScript(script, lang, v);
}


 
Piter ©   (2005-07-11 18:42) [5]

А можно пример вызова этой функции?


 
wicked ©   (2005-07-11 18:48) [6]

например, так:
ExecuteScript(wbMain, "RefreshGrades("%s");", ARRAYOFCONST((grades)));
здесь,
wbMain - TWebBrowser
RefreshGrades("%s") - функция, принимающая строковый параметр
ARRAYOFCONST((grades)) - макрос билдера, эмулирующий паскалевский array of const...
то есть, на паскале, я себе мыслю, вызов бы выглядел так:
ExecuteScript(wbMain, "RefreshGrades(""%s"");", [grades]);

ЗЫ DelphiInterface<IHTMLDocument2> в паскале заменить на IHTMLDocument2... ну и другие, по аналогии... также, _di_IDispatch = IDispatch...


 
Piter ©   (2005-07-11 19:46) [7]

wicked ©   (11.07.05 18:48) [6]
[grades]


слушай, я не понял... а что такое grades?

Я так понимаю, будет вызвана JS функция RefreshGrades и ей передан параметр grades?
А что такое grades?

И еще, по-моему, ты не указал в примере вызова четвертый параметр - size


 
DiamondShark ©   (2005-07-11 20:23) [8]

Я так понял, на дельфи это будет выглядеть примерно так:

(WebBrowser1.Document as IHTMLDocument2).parentWindow.execScript("TestFunc()", "JavaScript");


 
Piter ©   (2005-07-12 00:26) [9]

DiamondShark ©   (11.07.05 20:23) [8]

Там еще третий параметр variant надо передать, видимо


 
wicked ©   (2005-07-12 00:31) [10]

> Piter ©   (11.07.05 19:46) [7]
сори... grades - это строка... хотя из параметров формата можно было и догадаться... ;)


> И еще, по-моему, ты не указал в примере вызова четвертый
> параметр - size

в делфи его указывать не нужно - при array of const он передается неявно... в билдере его нужно указывать, но этим занимается макрос ARRAYOFCONST - он резолвится в 2 параметра...

> DiamondShark ©   (11.07.05 20:23) [8]
поправочка... не
> WebBrowser1.Document as IHTMLDocument2

а

> WebBrowser1.ControlInterface.Document as IHTMLDocument2

причины сего см. здесь - http://www.delphikingdom.com/asp/viewitem.asp?catalogid=366
также забыли 3-й параметр для execScript...


 
Piter ©   (2005-07-12 14:19) [11]

wicked ©   (12.07.05 0:31) [10]

спасибо! Все получилось


 
Piter ©   (2005-07-12 19:49) [12]

А если функция возвращает какое-то значение - этот код тоже применим?


 
DiamondShark ©   (2005-07-12 20:15) [13]


> также забыли 3-й параметр для execScript...

Нет там никакого 3-го параметра.
Это ж Дельфи, соглашение safecall, [out, retval] параметер возвращается как результат функции, а ошибочный HRESULT преобразуется в Exception.

Фрагмент MSHTML_TLB.pas:


IHTMLWindow2 = interface(IHTMLFramesCollection2)
 ["{332C4427-26CB-11D0-B483-00C04FD90119}"]
...
 function  execScript(const code: WideString; const language: WideString): OleVariant; safecall;
...



> А если функция возвращает какое-то значение - этот код тоже
> применим?

Если верить MSDN, то возвращается всегда Unassigned.


 
Piter ©   (2005-07-12 23:54) [14]

А как же тогда вызывать функции, получая результат?


 
wicked ©   (2005-07-13 00:13) [15]

возможно, скажу глупость, но это можно решить через external-интерфейс... если честно, то лень копать (есть в проекте)...
проще дать ссылку - http://www.euromind.com/iedelphi/embeddedwb/ongetexternal.htm
также посоветую:
1) скачать и установить этот ихний TEmbeddedWB - красивая штучка, must have...
2) подчитать раздел msdn, посвященный web browser"у...

ЗЫ если чего не ясно - сори, полтора литра пива почти натощак не способствуют... ;)


 
Piter ©   (2005-07-15 18:34) [16]

wicked ©   (13.07.05 0:13) [15]

а не посмотришь случаем тему - http://delphimaster.net/view/10-1121163665/ ?


 
DiamondShark ©   (2005-07-15 18:47) [17]


> А как же тогда вызывать функции, получая результат?

А ты попробуй.
Вдруг они наврали.



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.052 c
9-1113965646
Xeno
2005-04-20 06:54
2005.08.07
Отсечение объектов вне обзора камеры в GLScene


4-1118057183
pavel_guzhanov
2005-06-06 15:26
2005.08.07
можно ли преобразовать файл *.pdf в файл изображения?


9-1113983835
lifo
2005-04-20 11:57
2005.08.07
Алгоритм сравневаия рисунков


14-1121339167
alex-drob
2005-07-14 15:06
2005.08.07
Delphi 2005 не могу скомпилировать


3-1120132278
Vasek
2005-06-30 15:51
2005.08.07
Проблемма с security.fdb?