Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
14-1121273216
TBender
2005-07-13 20:46
2005.08.07
IRC...


14-1121514195
Экспериментатор
2005-07-16 15:43
2005.08.07
Как написать скриптик на VB, который бы


1-1121436394
arhis
2005-07-15 18:06
2005.08.07
Инициализация фрейма


1-1121783348
Андрей Жук
2005-07-19 18:29
2005.08.07
Многоколоночный TreeView - реализации


14-1121262155
lookin
2005-07-13 17:42
2005.08.07
У кого есть свой сайт со своими фотоматериалами?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский