TWebBrowser Delphi - Aguardar conclusão da solicitação

Delphi

23/06/2016

Caros,
Estou utilizando TWebBrowser e preciso enviar comandos em sequencia, porém aguardar a conclusão de cada um.
A pagina possui AJAX e SCRIPT'S e só posso enviar o próximo comando após estes eventos.
Terei que criar eventos NavigateComplete2 ou DocumentComplete em tempo de execução já que os eventos de complete são diferentes após cada chamada?
Algum exemplo?

Obrigado.
Luiz Bergamo

Luiz Bergamo

Curtidas 0

Melhor post

Mateus Ribeiro

Mateus Ribeiro

24/06/2016

Bom dia amigo!
Segue uma solução que usei a um tempo atrás, trabalhando com 3 eventos do browser:

TForm1 = class(TForm)
    private
      CurDispatch: IDispatch; 
      FDocLoaded: Boolean;    
    ....


    procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch;
      const URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
      var Cancel: WordBool);
    begin
      CurDispatch := nil;
      FDocLoaded := False;
    end;

    procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch;
      const URL: OleVariant);
    begin
      if (pDisp = CurDispatch) then  
      begin
        FDocLoaded := True;
        CurDispatch := nil;
      end;
    end;

    procedure TForm1.WebBrowser1NavigateComplete2(ASender: TObject; const pDisp: IDispatch;
      const URL: OleVariant);
    begin
      if CurDispatch = nil then
        CurDispatch := pDisp;
    end;


Agora por exemplo, para esperar o WebBrowser terminar de carregar o navigate se usa assim:
WebBrowser1.Navigate('www.devmedia.com.br');
    repeat Application.ProcessMessage until FDocLoaded;


Espero que seja isso, boa sorte!
GOSTEI 1

Mais Respostas

Luiz Bergamo

Luiz Bergamo

23/06/2016

Mateus, Obrigado pela ajuda.
Funcionou para a maioria dos comandos, porém alguns edit's e listbox possuem onchange.

Chamo o onchange da seguinte forma:

WebBrowser1.OleObject.Document.all.Item('formTemplate:j_id28', 0).onchange;
repeat Application.ProcessMessages until FDocLoaded;

ele não respeita o onchange do objeto que por exemplo é popular outro listbox

O envento desta chamada é:
<input type="text" name="formTemplate:j_id28" maxlength="8" onchange="Richfaces.showModalPanel('popuprogress');;A4J.AJAX.Submit('formTemplate',event,{'similarityGroupingId':'formTemplate:j_id29','parameters':{'formTemplate:j_id29':'formTemplate:j_id29'} } )" size="25" tabindex="0">

Devo chama-la de outra forma ou temos que analisar outro evento do webbrowser?

Obrigado.

Luiz
GOSTEI 0
POSTAR