Einzelnen Beitrag anzeigen

Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#1

Warten bis der TWebBrowser fertig geladen hat?

  Alt 28. Dez 2008, 20:36
Hallo

Wie kann man zuverlässig feststellen, ob ein TWebBrowser fertig geladen hat?

1. Wenn Wait() von der Code-Library verwendet wird,
kann die Applikation unter Umständen nicht mehr beendet werden, da der Browser den ReadyState = READYSTATE_COMPLETE nicht in jedem Fall erreicht.

Test:

Delphi-Quellcode:
Webbrowser1.Navigate('http://www.microsoft.com/surface/');
Wait(Webbrowser1);
ShowMessage('mich wirst du nie sehen!');
Dabei werden folgende Ereignisse nacheinander ausgelöst:

20:26:28 : OnBeforeNavigate2 (1)
20:26:28 : OnDownloadBegin (1)
20:26:28 : OnDownloadComplete (1)
20:26:28 : OnDownloadBegin (2)
20:26:29 : OnNavigateComplete2 (1)
20:26:29 : OnBeforeNavigate2 (2)
20:26:29 : OnNavigateComplete2 (2)
20:26:29 : OnDownloadComplete (2)
20:26:29 : OnDocumentComplete (Frame wtPage geladen )
20:26:30 : OnDocumentComplete (komplettes Dokument geladen)
20:26:30 : OnBeforeNavigate2 (3)
20:26:30 : OnDownloadBegin (3)
20:26:30 : OnDownloadComplete (3)
20:26:30 : OnDownloadBegin (4)
20:26:30 : OnDownloadComplete (4)

Auch der andere Ansatz von der Codlib von mir (Vergleich CurWebrowser = TopWebBrowser) bringt nicht
das gewünschte Ergebnis, da nach "OnDocumentComplete (komplettes Dokument geladen)" nochmals OnBeforeNavigate2 etc aufgerufen werden.

Dann gibt es noch die Möglichkeit, die obige Wait Procedure mit einem TimeOut zu erweitern, was
nicht mehr dazu führt, dass die Anwendung nicht mehr beendet werden kann.

Delphi-Quellcode:
function WaitForBrowser(WB: TWebbrowser; TimeOut: Integer = 8000): Boolean;
var
  StartTime, EndTime: DWORD;
begin
  Result := False;
  StartTime := GetTickCount;
  repeat
    Application.ProcessMessages;
    EndTime := GetTickCount;
  until (WB.ReadyState = READYSTATE_COMPLETE) or (Application.Terminated) or (EndTime - StartTime > TimeOut);
  Result := WB.ReadyState = READYSTATE_COMPLETE;
end;
Vielleicht hat ja jemand noch weitere Vorschläge?
Thomas
  Mit Zitat antworten Zitat