Colocación de los oyentes es bastante fácil (sólo en las versiones anteriores de 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;
En cuanto a las funciones ampliadas para conseguir JavaScript resultados directamente: (¿aún) el tronco no los contiene. Parece ser un trabajo en progreso.
Editar:
Deshacerse de sondeo a través de extensiones :
De hecho, es posible que el código JavaScript para llamar de nuevo en su código de Delphi usando extensiones. Además, puede enviar valores de JavaScript a Delphi; esto podría usarse para transferir resultados sin necesidad de sondear.
Primero en su sección initialization
registrar la extensión, lo que crea un objeto JavaScript para posteriormente ser usado en la llamada de vuelta:
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;
TMyHandler
's Execute
se invocará después. TMyHandler
se define como
TMyHandler = class(TCefv8HandlerOwn)
protected
function Execute(const name: ustring; const obj: ICefv8Value;
const arguments: TCefv8ValueArray; var retval: ICefv8Value;
var exception: ustring): Boolean; override;
end;
La aplicación con fines de demostración es simple por ahora:
function TMyHandler.Execute(const name: ustring; const obj: ICefv8Value; const arguments: TCefv8ValueArray; var retval: ICefv8Value; var exception: ustring): Boolean;
begin
ShowMessage('Execute!');
end;
Ahora para probar la llamada en Delphi desde JavaScript simplemente hacer:
ChromiumComponent.Browser.MainFrame.ExecuteJavaScript('cef.test.test_object().GetMessage();', 'about:blank', 0);
Esto debería mostrar la cuadro de mensaje que dice "¡Ejecutar!".
Saqué el guión de demostración de una muestra llamada cefclient que se puede encontrar en las \ demos \ cefclient carpeta en el directorio raíz de componentes. El código de muestra de extensión está un poco oculto y mezclado con otro código de demostración. Pero de especial interés para nosotros es la implementación de TExtension.Execute
(el equivalente a mi TMyHandler.Execute
). Allí puede encontrar cómo determinar qué función se está llamando y cómo pasar parámetros. (Link to the code.)
Wow, Delphi-6 donde tienes que hacer todo Unicode a mano y Chromium con soporte completo Unicode.Ahora eso suena como un desajuste de impedancia para mí :) –
"Impedancia no coincidente". Hay un ingeniero de electrónica en la sala de gente. :) Tienes razón, pero Delphi 6 sigue siendo mi IDE favorito. Por ahora. –
Ojalá fuera un ingeniero de electrónica; Nunca tuve la oportunidad de estudiarlo, pero todavía tengo la sensación de que conocer la ingeniería electrónica y tener una idea de qué puede salir mal allí es tremendamente útil en la TI. Entiendo que te guste Delphi 6, pero te insto a que busques versiones más actuales. Recientemente tuve que volver, y había tanto que extrañaba ... –