AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Warten bis der TWebBrowser fertig geladen hat?
Thema durchsuchen
Ansicht
Themen-Optionen

Warten bis der TWebBrowser fertig geladen hat?

Ein Thema von toms · begonnen am 28. Dez 2008 · letzter Beitrag vom 30. Dez 2008
Antwort Antwort
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, 19: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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.345 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Warten bis der TWebBrowser fertig geladen hat?

  Alt 28. Dez 2008, 19:41
Schau mal hier:
OnDocumentComplete

Und so sollte das eigentlich immer korrekt funktionieren, auch wenn das Dokument aus Frames besteht.
// EDIT:
Sorry nicht richtig gelesen...

Ich hätte gedacht, dass OnDocumentComplete korrekt funktioniert nach der beschriebenen Vorgehensweise. Hast du eine Seite als Beispiel wo das nicht funktioniert?
Sebastian Jänicke
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

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

Re: Warten bis der TWebBrowser fertig geladen hat?

  Alt 28. Dez 2008, 19:45
Zitat von jaenicke:
Schau mal hier:
OnDocumentComplete

Und so sollte das eigentlich immer korrekt funktionieren, auch wenn das Dokument aus Frames besteht.
Hallo Sebastian, nach dem OnDocumentComplete werden jedoch noch weitere Ereignisse ausgelöst was ja heissen muss, dass die Seite noch nicht fertig geladen ist?
(DefaultInterface = pDisp berücksichtigt bei Frames)
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.345 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Warten bis der TWebBrowser fertig geladen hat?

  Alt 28. Dez 2008, 19:51
Kann es sein, dass auf der Seite etwas per Skript passiert? Ich probiere es einmal aus.

Bisher hatte ich jedenfalls noch nie das Problem, dass der Quelltext einer Seite danach noch nicht komplett war.
Sebastian Jänicke
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

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

Re: Warten bis der TWebBrowser fertig geladen hat?

  Alt 28. Dez 2008, 20:00
Zitat von jaenicke:
Kann es sein, dass auf der Seite etwas per Skript passiert? Ich probiere es einmal aus.

Bisher hatte ich jedenfalls noch nie das Problem, dass der Quelltext einer Seite danach noch nicht komplett war.
Ist gut möglich, dass im Hintergrund noch Scripts laufen.

Auch auf der CNN.com Seite werden nach dem "OnDocumentComplete (komplettes Dokument geladen)" weitere Ereignisse
ausgelöst.

Zitat:
20:57:36 : OnBeforeNavigate2 (1)
20:57:36 : OnDownloadBegin (1)
20:57:36 : OnDownloadComplete (1)
20:57:36 : OnDownloadBegin (2)
20:57:36 : OnNavigateComplete2 (1)
20:57:37 : OnBeforeNavigate2 (2)
20:57:37 : OnBeforeNavigate2 (3)
20:57:37 : OnNavigateComplete2 (2)
20:57:37 : OnDownloadComplete (2)
20:57:37 : OnDocumentComplete Frame csiDataIframecsi1
20:57:37 : OnDownloadBegin (3)
20:57:37 : OnBeforeNavigate2 (4)
20:57:37 : OnBeforeNavigate2 (5)
20:57:38 : OnBeforeNavigate2 (6)
20:57:38 : OnNavigateComplete2 (3)
20:57:38 : OnDownloadComplete (3)
20:57:38 : OnDocumentComplete Frame qv_iframe_44245
20:57:38 : OnNavigateComplete2 (4)
20:57:38 : OnDocumentComplete Frame
20:57:38 : OnNavigateComplete2 (5)
20:57:38 : OnDocumentComplete Frame
20:57:38 : OnNavigateComplete2 (6)
20:57:38 : OnDocumentComplete Frame
20:57:38 : OnDocumentComplete (komplettes Dokument geladen).
20:57:38 : OnBeforeNavigate2 (7)
20:57:38 : OnDownloadBegin (4)
20:57:38 : OnNavigateComplete2 (7)
20:57:38 : OnDownloadComplete (4)
20:57:38 : OnDocumentComplete Frame
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.345 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Warten bis der TWebBrowser fertig geladen hat?

  Alt 28. Dez 2008, 20:56
Du siehst aber an den Adressen, dass danach noch Skripts ausgeführt werden, die dazu dienen die Werbung anzuzeigen.
http://ads.cnn.com/...

Die Seite an sich war aber bereits fertig. Ob danach noch Skripts laufen, die dann irgendwann noch Änderungen an der Seite vornehmen kann man glaube ich nicht so einfach feststellen.
Aber ich kann schauen, ob das geht, wenn du das brauchst.
Sebastian Jänicke
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

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

Re: Warten bis der TWebBrowser fertig geladen hat?

  Alt 30. Dez 2008, 15:34
Zitat von jaenicke:
Aber ich kann schauen, ob das geht, wenn du das brauchst.
Falls du etwas herausfindest, kannst du dich ja melden.
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz