TChromium
, как бы вернуть значение из javascript...
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.172] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
TChromium
, как бы вернуть значение из javascript...
|
Сообщ.
#1
,
|
|
|
|
Здравствуйте!
Пишу сюда, так как вопрос все же имеет отношение к Дельфи компоненту ![]() А именно TChromium. Пытаюсь поймать значение, возвращаемое javascript функции. Пробую сделать как в примере здесь ![]() ![]() procedure RegisterExtension; var Code:string; begin Code := 'var cef;'+ 'if (!cef)'+ ' cef = {};'+ 'if (!cef.test)'+ ' cef.test = {};'+ '(function() {'+ ' cef.test.__defineGetter__(''test_param'', function() {'+ ' native function GetTestParam();'+ ' return GetTestParam();'+ ' });'+ ' cef.test.__defineSetter__(''test_param'', function(b) {'+ ' native function SetTestParam();'+ ' if(b) SetTestParam(b);'+ ' });'+ ' cef.test.test_object = function() {'+ ' native function my_func();'+ ' return my_func();'+ ' };'+ '})();'; CefRegisterExtension('example/v8', Code, TMyHandler.Create as ICefv8Handler); end; my_func - функция, возвращает значение int. Далее там предлагается ловить возврат через Handler. ![]() ![]() function TMyHandler.Execute(const name: ustring; const obj: ICefv8Value; const arguments: TCefv8ValueArray; var retval: ICefv8Value; var exception: ustring): Boolean; begin ShowMessage('Execute!'); end; Проблема в том, что прилетает retval=nil. Хотя функция рабочая (сейчас используется TWebBrowser, там есть возможность получать возврат JS функций через OLE). Пытался делать возврат конкретного значения ![]() ![]() ' cef.test.test_object = function() {'+ ' native function my_func();'+ ' return 1;'+ при этом Handler не работает совсем. Кто с таким сталкивался, плиз хелп. |
|
Сообщ.
#2
,
|
|
|
|
Цитата WildBear @ Далее там предлагается ловить возврат через Handler ... Проблема в том, что прилетает retval=nil. Пример с ShowMessage в TMyHandler.Execute это просто демонстрация того, что происходит вызов Execute из скрипта. А реальный пример реализации Execute приведен дальше по ссылке (см. код TExtension.Execute). Суть в том, что скрипт Code задает лишь имена native function, а их реальный вызов по имени и установка retval должны производиться в методе Execute. В твоем случае как-то так: ![]() ![]() function TMyHandler.Execute(const name: ustring; const obj: ICefv8Value; const arguments: TCefv8ValueArray; var retval: ICefv8Value; var exception: ustring): Boolean; var i:integer; begin Result:=false; if name = 'my_func' then begin i:=my_func(); retval:=TCefv8ValueRef.CreateInt(i); Result:=true; end; ... end; Другими словами это не способ передачи значения из скрипта в дельфи-код, а, наоборот, реализация дельфи-функций, которые могут быть использованы в скриптах. Если же нужно, что-то получить из скрипта, то нужно в самом скрипте сделать вызов некой своей функции или процедуры и передать в нее нужное значение в качестве параметра. В исходном примере такой процедурой является, например, SetTestParam(b) - при ее вызове из скрипта будет вызван метод Execute с параметрами name='SetTestParam' и arguments[0]=b |
|
Сообщ.
#3
,
|
|
|
|
Спасибо за подробный ответ. Пока сделал по простому, через OnConsoleMessage.
|