Форум: "Потрепаться";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
ВнизВызов 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.033 c