Quantcast
Channel: AUTOMALABS
Viewing all articles
Browse latest Browse all 63

Como fazer o Delphi executar uma função Javascript em um TwebBrowser

$
0
0

Meu exemplo é um resumo desta excelente explicação de Paul Johnson aqui.

Fazer isso é muito simples. Muito mais simples que o oposto, que é fazer o seu programa em Delphi responder a eventos que ocorrem no TwebBrowser.

Digamos que você tenha um componente TwebBrowser no seu projeto Delphi nomeado webbrowser1 que esteja carregado com uma página que tem a função javascript exibirGrafico(). Para chamar essa função você só precisa fazer algo assim:

procedure TForm1.ExecutaJS();
var
  Doc: IHTMLDocument2;      
  HTMLWindow: IHTMLWindow2; 
  JSFn: string;             
begin
  // Obtem a referência ao documento corrente
  Doc := WebBrowser1.Document as IHTMLDocument2;
  if not Assigned(Doc) then
    Exit;

  // Obtem a janela pai do documento corrente
  HTMLWindow := Doc.parentWindow;
  if not Assigned(HTMLWindow) then
    Exit;

  // Executa o JavaScript
  try
    JSFn := 'exibirGrafico()';
    HTMLWindow.execScript(JSFn, 'JavaScript');
  except
    // Manipula a exceção caso não rode
    ShowMessage('Erro ao executar JavaScript');
  end;

end;

Executar “ExecutaJS” no seu programa irá chamar a função “exibirGrafico()” carregada no documento HTML.

Note que a maior parte do que você vê acima é manipulação de erros. Se você não se preocupar com isso a procedure se resume a isto:

procedure TForm1.ExecutaJS();
var
  Doc: IHTMLDocument2;      
  HTMLWindow: IHTMLWindow2; 
  JSFn: string;             
begin

  Doc := WebBrowser1.Document as IHTMLDocument2;
  HTMLWindow := Doc.parentWindow;
  JSFn := 'exibirGrafico()';
  HTMLWindow.execScript(JSFn, 'JavaScript');

end;

Só existe um inconveniente: você não pode receber o retorno da função. É possível contornar esse problema e o artigo de Paul explica como fazer, mas eu ainda não precisei dessa funcionalidade e por isso só vou abordar esse problema outro dia.

Note que o motivo número 1 para você se deparar com erros ao tentar executar o script é estar usando a configuração errada. O número 2 é esquecer que javascript é Case Sensitive. Isto é: exibirGrafico() e ExibirGrafico() são funções diferentes.

Como passar um parâmetro para a função.

Digamos que a função javascript exibirGrafico espere por um parâmetro texto que está no componente edit1. Você pode executá-la com algo assim:

JSFn := 'exibirGrafico(''' + edit1.Text + ''')';

 


Viewing all articles
Browse latest Browse all 63