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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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:
1 |
JSFn := 'exibirGrafico(''' + edit1.Text + ''')'; |
Leave a Comment