Ver Mensaje Individual
  #3  
Antiguo 01-07-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
He notado que el problema planteado es muy recurrente. Es como si las propiedades Busy y ReadyState de TWebBrowser, por sí solas, no fueran del todo fiables.

Hace tiempo implementé esta solución. Ojalá a ti también te resulte útil.

Código Delphi [-]
Unit WaitWebBrowser;

Interface

  Uses
    ShDocVw, ActiveX;

  Type
    TWaitWebBrowser = Class (TWebBrowser)
      Protected
        { Fields }
        WaitingForDocumentComplete :Boolean;

        { Static methods }
        Function GetIdle :Boolean;

        { Overridden methods }
        Procedure InvokeEvent (DispID :TDispID; Var Params :TDispParams);
          Override;
      Public
        { Static methods }
        Procedure NavigateWait (Const URL :String);
        Procedure WaitForIdle;

        { Properties }
        Property Idle :Boolean Read GetIdle;
    End;

Implementation

  Uses
    Forms;

  { TWaitWebBrowser }

  { Protected static methods }

  Function TWaitWebBrowser.GetIdle :Boolean;
  Begin
    Result := Not WaitingForDocumentComplete And Not Busy And
      (ReadyState = ReadyState_Complete);
  End;

  { Protected overridden methods }

  Procedure TWaitWebBrowser.InvokeEvent (DispID :TDispID;
    Var Params :TDispParams);
  Begin
    If DispID = 250 Then  // OnBeforeNavigate2
      WaitingForDocumentComplete := True
    Else
      If (DispID = 259 { OnDocumentComplete }) And
      (ReadyState = ReadyState_Complete) Then
        WaitingForDocumentComplete := False;

    Try
      Inherited InvokeEvent (DispID, Params);
    Except
      WaitingForDocumentComplete := False;
      Raise;
    End;
  End;

  { Public static methods }

  Procedure TWaitWebBrowser.NavigateWait (Const URL :String);
  Begin
    Navigate (URL);
    WaitForIdle;
  End;

  Procedure TWaitWebBrowser.WaitForIdle;
  Begin
    Repeat
      Forms.Application.ProcessMessages;
    Until Idle;
  End;

End.

Código Delphi [-]
WaitWebBrowser1.NavigateWait ('http://www.clubdelphi.com/');

Un saludo.

Al González.
P.D. Miguel, te recomienzo esforzarte en el empleo adecuado de acentos. Con ello te darás a entender mejor en tus siguientes intervenciones.
Responder Con Cita