Avatar billede dallan2007 Nybegynder
22. juni 2009 - 09:40 Der er 9 kommentarer og
1 løsning

Webbrowser vente indtil færdig før forsæt

Hej,

Jeg har følgende handlinger der skal udføres med en twebbrowser:

Webbrowser1.navigate('http://www.domæne1.dk');
Webbrowser1.navigate('http://www.domæne2.dk');
showmessage('test');
Webbrowser1.navigate('http://www.domæne3.dk');
Webbrowser1.navigate('http://www.domæne4.dk');

Men den "venter" ikke på de 2 første domænekald og går direkte til showmessage først. Hvordan får jeg den den til at blive færdig med navigationen før den går videre?
Avatar billede Six Nybegynder
22. juni 2009 - 10:39 #1
kender ikke til delphi programmering. Med det sagt, mener jeg stadig jeg måske kan komme med et forslag.

kunne du ikke prøve noget lign.

Webbrowser1.navigate('http://www.domæne1.dk');
Sleep ( 5000 );
Webbrowser1.navigate('http://www.domæne2.dk');
Sleep ( 5000 );
showmessage('test');
Webbrowser1.navigate('http://www.domæne3.dk');
Webbrowser1.navigate('http://www.domæne4.dk');

Jeg ved ikke om der er en sleepfunktion - men ellers er der nok noget andet delay af en art.
Avatar billede dallan2007 Nybegynder
22. juni 2009 - 10:47 #2
Der er en sleep, men det er ikke en speciel pæn løsning da browseren ofte tager kortere tid; og hvad hvis den tager længere tid?

Den skal helst lave et slags true/false kald til webbrowserens Busy funktion, men hvordan man lige kringler den aner jeg ikke.
Avatar billede Six Nybegynder
22. juni 2009 - 11:07 #3
Nej jeg kan godt se problemet med sleep. Så er jeg desværre sat af her hehe :)

Håber du får det løst, held og lykke :)
Avatar billede borrisholt Novice
22. juni 2009 - 11:47 #4
Prøv der her :

unit Unit7;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, StdCtrls;

type
  TForm7 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    procedure WebBrowser1NavigateComplete2(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
    procedure WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
    procedure Button1Click(Sender: TObject);
  private
    CurDispatch: IDispatch;
  public
    { Public declarations }
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}

procedure TForm7.Button1Click(Sender: TObject);
begin
  Button1.Tag := (Button1.Tag + 1) mod 2;
  if Button1.Tag = 0 then
    WebBrowser1.Navigate('www.jp.dk')
  else
    WebBrowser1.Navigate('www.berlingske.dk');

end;

procedure TForm7.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
  if (pDisp = CurDispatch) then
    Beep {the document is loaded, not just a frame }
  else
    Caption := TimeToStr(now);

  CurDispatch := nil; {clear the global variable }
end;

procedure TForm7.WebBrowser1NavigateComplete2(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
  if CurDispatch = nil then
    CurDispatch := pDisp; { save for comparison }
end;

end.


Jens B
Avatar billede borrisholt Novice
22. juni 2009 - 12:31 #5
Nå ja det skulle være et svar
Avatar billede dallan2007 Nybegynder
22. juni 2009 - 13:55 #6
Hej Borris, jeg tror ikke helt det virker efter hensigten. Hvis jeg udskifter din button med min, så kommer showmessage stadigvæk op før første navigation er færdig.

WebBrowser1.Navigate('http://www.google.dk');
showmessage('gdfgfdg');
WebBrowser1.Navigate('http://www.yahoo.dk');

Showmessage hopper op før google har loaded.
Avatar billede dallan2007 Nybegynder
22. juni 2009 - 13:59 #7
Kunne man ikke lave noget a la dette:

WebBrowser1.Navigate('http://www.google.dk');

try untill webbrowser not webbrowser.busy do
showmessage('gdfgfdg');
end;

WebBrowser1.Navigate('http://www.yahoo.dk');
Avatar billede borrisholt Novice
22. juni 2009 - 14:03 #8
ja selvfølgelig

TWebBrowser er non blocking. det betyder den kalder et event nåt forskellige ting sker ... Hvis du kigger på mit eksempel vil du se jeg bruger to events. Jeg har kodet eksemplet her til formiddag.

Så svar på dit spørgsmål :

try untill webbrowser not webbrowser.busy do
showmessage('gdfgfdg');
end;


Nej det kan man heldigvis ikke, da det er noget slam. Tilgængæld kan du få at vide når din browser har loaded siden ind.
Avatar billede dallan2007 Nybegynder
22. juni 2009 - 14:17 #9
Ooookay... men at jeg får et klokkeslet på browserens færdig-load-tid er jo lidt svært at implementere til mit problem. Kan ikke se hvordan jeg skal kunne bruge det.
Avatar billede dallan2007 Nybegynder
22. juni 2009 - 14:41 #10
Fandt en løsning, lukker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester