Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi twebbrowser will einfach nicht warten (https://www.delphipraxis.net/95023-twebbrowser-will-einfach-nicht-warten.html)

pillepalle 29. Jun 2007 11:35


twebbrowser will einfach nicht warten
 
ich benutze derzeit folgende procedure:

Delphi-Quellcode:
procedure TseotoboForm.Wait(WebBrowser1: TWebBrowser);
begin
while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
begin
  Application.ProcessMessages;
  delay(50);
end;
end;
die hab ich hier vom forum aufgeschnappt :)

leider will twebbrowser einfach nicht warten, mir fällt es generell auf wenn ich ein formular per submit losschicke und durch eine langsame verbindung zum server der webbrowser versucht das nächste formular auszufüllen, welches dann natürlich noch nicht vorhanden ist

gibt es eine 100%ige lösung dafür das twebbrowser nur dann weitermachen wenn _alles_ geladen ist?

marabu 29. Jun 2007 12:41

Re: twebbrowser will einfach nicht warten
 
Herzlich willkommen in der Delphi-PRAXiS, pillepalle.

Die Prozedur ist auf den ersten Blick nicht schlecht, aber hat auf den zweiten Blick einen Mangel: Wird sie direkt nach dem WebBrowser.Navigate() aufgerufen und wurde der WebBrowser bereits einmal initialisiert, dann dürfte ReadyState beim Eintritt in die Prozedur immernoch auf 'Complete' stehen.

Besser als dieses Busy-Waiting ist das Arbeiten mit den vorgesehenen Ereignissen OnBeforeNavigate2() und OnDocumentComplete(). Auch dazu findest du in der DP reichlich Quellcode-Beispiele.

Delphi-Quellcode:
type
  TWebForm = class(TForm)
  // ...
  private
    DocumentWait: IDispatch;
    procedure ProcessDocument(document: IHTMLDocument2);
  end;

// ...
 
procedure TWebForm.WebBrowserBeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
  DocumentWait := pDisp;
end;

procedure TWebForm.WebBrowserDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  if DocumentWait = pDisp then
    with pDisp as IWebBrowser2 do
      ProcessDocument(Document as IHTMLDocument2);
end;

procedure TWebForm.ProcessDocument(document: IHTMLDocument2);
begin
  ShowMessage(document.title);
end;
Freundliche Grüße vom marabu

pillepalle 29. Jun 2007 14:45

Re: twebbrowser will einfach nicht warten
 
funktioniert super, danke für deinen support, echt spitze!


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 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