На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> TChromium , как бы вернуть значение из javascript...
    Здравствуйте!
    Пишу сюда, так как вопрос все же имеет отношение к Дельфи компоненту :)
    А именно TChromium.
    Пытаюсь поймать значение, возвращаемое javascript функции. Пробую сделать как в примере здесь

    ExpandedWrap disabled
      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.

    ExpandedWrap disabled
      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).
    Пытался делать возврат конкретного значения
    ExpandedWrap disabled
         '  cef.test.test_object = function() {'+
         '    native function my_func();'+
         '    return 1;'+

    при этом Handler не работает совсем.

    Кто с таким сталкивался, плиз хелп.
      Цитата WildBear @
      Далее там предлагается ловить возврат через Handler
      ...
      Проблема в том, что прилетает retval=nil.

      Пример с ShowMessage в TMyHandler.Execute это просто демонстрация того, что происходит вызов Execute из скрипта. А реальный пример реализации Execute приведен дальше по ссылке (см. код TExtension.Execute). Суть в том, что скрипт Code задает лишь имена native function, а их реальный вызов по имени и установка retval должны производиться в методе Execute. В твоем случае как-то так:
      ExpandedWrap disabled
        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
      Сообщение отредактировано: leo -
        Спасибо за подробный ответ. Пока сделал по простому, через OnConsoleMessage.
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0.0602 ]   [ 15 queries used ]   [ Generated: 20.09.26, 19:47 GMT ]