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?