[Delphi] Jak wykryć ze IE skończył juz pobierać WWW??

0

Zrobiłem funkcję

[code]
function DownloadSite(Source:string): string;
var
IE : Variant;
begin
Try
IE:=CreateOleObject('InternetExplorer.Application');
IE.Navigate(Source);
Sleep(20000); //czas na pobranie strony
result:=IE.Document.documentElement.innerHTML;
except
Result := 'False';
end;
end;
[/code]

myślę co moge dać zamiast sleep'a bo to nie najlepsze rozwiązanie...
mozecie powiedzieć w jaki sposob mam wykryć czy IE skonczył pobierać stronę ?? wtedy wstawiłbym to zamiast sleep'a...

ps. niemam TWebbrowser a nawet gdybym miał to bym go nie uzywał bo program nie jest przeglądarką WWW :)

0

Weź sobie jakiś komponent do pobierania stron WWW. Polecam IdHTTP z pakietu Indy.

IE ma coś takiego jak zmienną ReadyState. Posiada także zdarzenia: OnDownloadComplete, OnDocumentComplete, OnNavigateComplete2. Poczytaj w MSDN o tym.

0

IdHTTP nie jest zbytnio dobry nie bardzo potrafi pobrać np. www.google.pl albo stron przekierowywanych... dlatego kombinuję z IE, dzieki za razy poczytam o tym.

Pozdrawiam

0
Gość napisał(a)

IdHTTP nie jest zbytnio dobry nie bardzo potrafi pobrać np. www.google.pl albo stron przekierowywanych... dlatego kombinuję z IE, dzieki za razy poczytam o tym.

Musisz zmienić w IdHTTP nazwę przeglądarki, jaką komponent podaje, ta domyśla jest zazwyczaj poblokowana przez administratorów. Co do przekierowan to możesz ustawić HandleRedirect na True, fakt, nie obsłuży czegoś takiego jak meta-refresh, ale wolę to od wykorzystywania IE.

0

Wypracowałem pewnen kompromis bo <ort>wykozytsanie </ort>ReadyState w delphi albo jest za trudne albo <ort>po prostu </ort>tego nie umiem - bo
[delphi]
var
document: IHTMLDocument2;
begin
document := IE.Document as IHTMLDocument2;
[/delphi]

sie <ort>nieda </ort>- as jest nieodpowiedni do tego typu zastosowania - taki błąd...

wiec zrobiłem kompromis sleep i IE.Busy bo bez Sleepa na niektorych WWW sciaga tylko <head>
a wyglada to tak [delphi]

function DownloadSite(Source:string): string;
var
IE : Variant;
begin
Try
IE:=CreateOleObject('InternetExplorer.Application');
IE.Navigate(Source);
while IE.Busy do Application.ProcessMessages;
sleep(200);
result:=IE.Document.documentElement.innerHTML;
IE.Quit;
except
Result := 'False';
IE.Quit;
end;
end;
[/delphi]

jak <ort>na razie </ort>działa ale zobaczymy jak sie spisze... być moze ze wartość dla sleepa akurat odpowiada mojemu kompowi wiec jesli na innych bedzie zle bede kombinował dalej...

0

pobieranie strony w ten sposób trąci lekkim masochizmem, to trochę tak jak byś używał czołgu do robienia zakupów w przydomowym sklepie... naprawdę nie możesz użyć indy albo synapse?

co do readystate - tu masz przykład:

  WebBrowser1.Navigate('http://4programmers.net');

  i := 0;
  while (WebBrowser1.ReadyState < 2) and (i < 1000) do
  begin
    Application.ProcessMessages;
    inc(i);
    sleep(50);
  end;

pętla się skończy gdy strona się dociągnie, albo gdy minie 50 sekund.

1 użytkowników online, w tym zalogowanych: 0, gości: 1