15

Delphi Chromium Embeddedを使用して、Delphi6プロジェクトにChromiumを正常に埋め込むことができました。ここで、Javascriptコードを実行して、結果をホストのDelphiアプリに返すことができるようにしたいと思います。私の現在の方法は、ExecuteJavascript()を呼び出し、Javascript呼び出しが結果を書き込むDOM要素を使用し、DelphiからTTimerメソッドでその要素をポーリングして結果を取得することです。ただし、ネイティブ関数とV8拡張機能を使用して、代わりに結果を受け取る方法として、JavascriptがDelphiコードに「コールバック」を呼び出す方法について読みました。

http://magpcss.org/ceforum/viewtopic.php?f=7&t=180

これを試してみたいと思います。また、DelphiベースのイベントリスナーをWebページのDOM要素(onblur、onmousedownなど)にアタッチする方法も知りたいです。誰かがそれらを見つける場所を知っている場合、私はこれらの2つのことを行う方法を私に示すいくつかのサンプルを探しています。

4

1 に答える 1

14

リスナーの接続は非常に簡単です(古いバージョンのCEFのみ)。

procedure MouseDownCallback(const Event: ICefDomEvent);
begin
  ShowMessage('Mouse down on '+Event.Target.Name);
end;

procedure AttachMouseDownListenerProc(const Doc: ICefDomDocument);
begin
  Doc.Body.AddEventListenerProc('mousedown', True, MouseDownCallback);
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ChromiumComponent.Browser.MainFrame.VisitDomProc(AttachMouseDownListenerProc);
end;

JavaScriptの結果を直接取得するための拡張関数について:トランクにはそれらが含まれていません(まだ?)。作業中のようです。

編集

拡張機能を介してポーリングを取り除く:

JavaScriptコードが拡張機能を使用してDelphiコードにコールバックすることは確かに可能です。さらに、JavaScriptからDelphiに値を送信できます。これを使用すると、ポーリングせずに結果を転送できます。

最初にinitializationセクションで拡張機能を登録します。これにより、後でコールバックするときに使用する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 GetTestObject();'+
   '    return GetTestObject();'+
   '  };'+
   '})();';

  CefRegisterExtension('example/v8', Code, TMyHandler.Create as ICefv8Handler);
end;

initialization
  RegisterExtension;

TMyHandlerExecuteは後で呼び出されます。TMyHandlerと定義されている

TMyHandler = class(TCefv8HandlerOwn)
protected
  function Execute(const name: ustring; const obj: ICefv8Value;
    const arguments: TCefv8ValueArray; var retval: ICefv8Value;
    var exception: ustring): Boolean; override;
end;

今のところ、デモンストレーション目的の実装は簡単です。

function TMyHandler.Execute(const name: ustring; const obj: ICefv8Value; const arguments: TCefv8ValueArray; var retval: ICefv8Value; var exception: ustring): Boolean;
begin
  ShowMessage('Execute!');
end;

ここで、JavaScriptからDelphiへの呼び出しをテストするには、次のようにします。

ChromiumComponent.Browser.MainFrame.ExecuteJavaScript('cef.test.test_object().GetMessage();', 'about:blank', 0);

これにより、「実行!」というメッセージボックスが表示されます。

コンポーネントのルートディレクトリの\demos\cefclientフォルダーにあるcefclientという名前のサンプルからデモスクリプトを取得しました。拡張機能のサンプルコードは少し隠されており、他のデモコードと混ざっています。しかし、私たちにとって特に興味深いのは、(myと同等の)の実装です。ここでは、呼び出されている関数を判別する方法と、パラメーターを渡す方法を見つけることができます。(コードへのリンク。TExtension.ExecuteTMyHandler.Execute

于 2011-08-01T07:01:27.247 に答える