Idhttp - petla pobierajaca kod stron z listbox

0

Witam, wczesniej uzywalem webbrowsera i wszystko dzialalo z wyjatkiem dlugiego ladowania stron.. na forum zostalem pokierowany by zmienic webbrowsera na idhttp i pobierac tylko kod zrodlowy strony w celu szybszego ladowania. Potrzebuje tylko aby moje wejscie bylo odnotowane czyli pewnie starczy tylko kilka naglowkow pobrac. aktualny kod:

var
i : integer;
html_tekst : string;
begin
listbox1.ItemIndex := 0;
idhttp1.ReadTimeout := 3000;;
try

for i:=0 to ListBox1.Items.Count-1 do
begin
memo1.lines.add(TimeToStr(Now) + ' Ładuję: ' + ListBox1.Items[i]);

html_tekst := IdHTTP1.Get(ListBox1.Items[i]);
Memo1.Lines.Add(html_tekst);
ListBox1.ItemIndex:=i;
end;

   except on e: EIdHTTPProtocolException do
        begin
            memo1.lines.add(idHTTP1.response.ResponseText);
            memo1.lines.add(e.ErrorMessage);
end;

Jednak otrzymuje blad: Socket Error # 10060 Connection timed out.

Czyli przekroczono czas oczekiwania ladowania strony - jak sie domyslam. Czy moge w takim przypadku przejsc po prostu do nastepnej strony z listbox i ja zaladowac ? A strony ktore nie chca sie wyswietlac po prostu pomijac ?

1
n900 napisał(a):

Czyli przekroczono czas oczekiwania ladowania strony - jak sie domyslam. Czy moge w takim przypadku przejsc po prostu do nastepnej strony z listbox i ja zaladowac ? A strony ktore nie chca sie wyswietlac po prostu pomijac ?

Tak, możesz! Jeżeli jednak chcesz się nauczyć programować to zacznij samemu pisać kod a nie wklejać gotowce, bo widać że nie rozumiesz kodu który piszesz.

0

nie jestem programista i za pewne nie bede, zajmuje sie cisco. a tu sie tak przez przypadek stalo ze musze taki program napisac dlatego prosze o pomoc

0

Po co w ciągu kilku dni zakładasz n-ty wątek na ten sam temat?
Dostałeś praktycznie gotowca to go zdubiłeś (i nie chodzi mi o formatowanie tylko w ogóle o kod) to już nie wiem jak ci można pomóc jak myślisz po co tam było: on E: EIdReadTimeout do bo chyba jak sama nazwa wskazuje musisz obsłużyć.
Próbujesz obsłużyć EIdHTTPProtocolException ale to nie załatwia sprawy ponieważ:
Hierarchia EIdHTTPProtocolException wygląda tak:
EIdExceptionBase -> EIdException -> EIdReplyError -> EIdReplyRFCError -> EIdHTTPProtocolException
a EIdReadTimeout:
EIdExceptionBase -> EIdException -> EIdReadTimeout
więc jak widzisz obsługując EIdHTTPProtocolException nie obsłużysz jednocześnie EIdReadTimeout muszisz zrobić tak jak ja zrobiłem Laczenie z linkami z listboxa tylko zamiast EIdSocketError możesz podstawić EIdHTTPProtocolException a jak koniecznie się upierasz aby te wyjątki złapać w jednym miejscu to obsługuj EIdException.
No i bardzo ważna sprawa w taki sposób jak napisałeś wyskoczysz poza pętlę w przypadku dowolnego wyjątku, musisz zrobić na mój wzór błędy Indy obsługuj sobie wewnątrz pętli pozostałe przekazuj dalej (raise).

0

Ok, zrobilem jak mowiles, korzystajac z Twojego gotowca podmienilem EIdSocketError na EIdHTTPProtocolException. Jednak caly czas otrzymuje blad: Project1.exe raised ecception class EIdSocketError with message 'Socket Error # 10060 Connection timed out' . Process stoped

0
n900 napisał(a):

Ok, zrobilem jak mowiles, korzystajac z Twojego gotowca podmienilem EIdSocketError na EIdHTTPProtocolException. Jednak caly czas otrzymuje blad: Project1.exe raised ecception class EIdSocketError with message 'Socket Error # 10060 Connection timed out' . Process stoped

No i tak ma być? Gdybyś umiał wznowić process i wywalić go do handlera... No ale przecież, ty nie programista, mamy to zrobić za ciebie. Może dział Praca? Bo albo się uczysz albo płacisz...

0

@n900 pokaż aktualny kod, bo już się pogubiłem co zrobiłeś. A nie jest tak przypadkiem że błąd masz tylko pod IDE?

0
procedure TForm1.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: String);
  begin
Memo1.Lines.Add(AStatusText);
  case AStatus of
    hsResolving: Memo1.Lines.Add('Wyszukiwanie hosta');
    hsConnecting: Memo1.Lines.Add('Łączenie z hostem');
    hsConnected: Memo1.Lines.Add('Połączenie zestawione.');
    hsDisconnecting: Memo1.Lines.Add('Rozłączanie');
    hsDisconnected: Memo1.Lines.Add('Rozłączono !');

end;
end;

procedure TForm1.Button7Click(Sender: TObject);
var
  i: Integer;
begin
  try
  IdHTTP1.HandleRedirects:= True;
  IdHTTP1.ReadTimeout:= 1000;
  for i:=0 to ListBox1.Items.Count -1 do
  begin
    ListBox1.ItemIndex:= i; //zaznaczyć aktualnie pobierana pozycje
    try
    Memo1.Text:= IdHTTP1.Get(ListBox1.Items[i]);
    //tu oczywiscie musisz cos robic bo jak na razie zmieniasz tekst w memo na
    //kod ostatnio pobranej strony
    except
      on E: EIdHTTPProtocolException  do
      begin
       //tu problemy z polaczeniem np. host not found ale zalozenie jest
       //takie ze czego nie da sie pobrac to pomijamy a wiec nic nie robimy
      end;
      on E: EIdReadTimeout do
      begin
       //tu tez zwyczajnie pomijamy wyjatek
      end
      else
        raise; //pozostale wyjatki skocz do nastepnego bloku obslugi
    end;
  end;
  except
    on E: Exception do
      Application.MessageBox(PAnsiChar(E.Message), PAnsiChar(Application.Title),
      MB_ICONERROR); //tylko pokazac komunikat bledu
  end;
end;

Wiele nie zmienialem bo dales praktycznie gotowca. Blad wyskakuje rowniez jak odpalam sam plik exe. Program mam napisany pod webbrowser i calosc dziala bez bledow. A ten kawalek kodu to ta czesc ktora odnosi sie do komponentu Indy Idhttp. Ale jak mowilem webbrowser dziala zbyt wolno.

a co do odpowiedzi -123oho ... nie wiem jak ty robisz kolego, ale fora sa po to zeby sie pytac i uczyc. na jednym forum sie pomaga a na drugim szuka pomocy. sam wiesz, ze nie mozna umiec wszystkiego, no moze Ty akurat wiesz bo piszesz jakbys pozjadal rozumy. Widocznie z programowania jestes alfa i omega. Ja sie na programowaniu nie znam, chociaz gdybym mial czas na nauke programowania to z checia bym sie pouczyl bo na pewno mozna z tego niezle zyc. Ja wybralem troche inny dzial informatyki z ktorego zyje i staram pomagac sie ludziom ktorzy tej pomocy szukaja. Wydaje mi sie ze dzial Newbie jest wlasnie dla takich ludzi jak ja. Ja nie prosze o pisanie kodu za mnie chociaz na pewno rozwiazalo by to moj problem i zaoszczedzilo czasu wszystkim. Ale to nie jest tak ze pisze ze mi nie dziala i tyle. Zanim pisze tutaj z jakim kolwiek problemem to przegladam google pod katem mojego problemu. Staram sie poskladac wszystko w calosc ale niestety wiedzy brakuje pod tym wzgledem. Btw. ten kawalek kodu z ktorym mam problem to tylko czesc programu, takie funkcje jak: program w trayu, usuwanie duplikatow z listboxa, wyswietlanie niezaladowanych stron w drugim listboxie, czas uruchamiania linkow oraz wyswietlanie nowozaladowanych linkow w chmurkach dzialaja bez zarzutu w mojej aplikacji, wiem ze to dla was dziecinnie proste ale dla mnie to i tak sukces :)

Pozdrawiam

0

sam wiesz, ze nie mozna umiec wszystkiego, no moze Ty akurat wiesz bo piszesz jakbys pozjadal rozumy.

No ba! Pozjadałem wszystkie rozumy bo umiem użyć googla.

Zanim pisze tutaj z jakim kolwiek problemem to przegladam google pod katem mojego problemu.

A wiesz co powinieneś zrobić zanim będziesz pisać swój kod? Ogarniać mechanizmy które stosujesz. Od tego są kursy.

wiem ze to dla was dziecinnie proste ale dla mnie to i tak sukces

Każdy gotowce umie wkleić i poskładać. I o ile wie się co się robi to nie ma problemu. Ale widać ty wklejasz kod, sklejasz go taśmą i myślisz że może zadziała...

na jednym forum sie pomaga a na drugim szuka pomocy.

No niestety ja na żadnych forach nie potrafię znaleźć pomocy.

sam wiesz, ze nie mozna umiec wszystkiego

Wystarczy że się umie pytać googla.

Gdybyś wpisał słowo kluczowe 'exception' + nazwę środowiska w google to otrzymałbyś to: Wyjątki - tam jest napisane czemu tobie ten błąd wyskakuje. No ale przecież ty googla pytałeś i dobrze wiesz że tego tam nie ma, czyż nie? No to dowiedzieliśmy się jeszcze tego że masz problemy z szukaniem w google...

0

Nie jestem w temacie i nie wiem co ten program ma robić, czy ma on pobierać kod html strony www?
Jeżeli tak, to poniższy kod działa u mnie bez problemu:

procedure TForm1.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: String);
begin
Memo1.Lines.Add(AStatusText);
  case AStatus of
    hsResolving: Memo1.Lines.Add('Wyszukiwanie hosta');
    hsConnecting: Memo1.Lines.Add('Łączenie z hostem');
    hsConnected: Memo1.Lines.Add('Połączenie zestawione.');
    hsDisconnecting: Memo1.Lines.Add('Rozłączanie');
    hsDisconnected: Memo1.Lines.Add('Rozłączono !');

end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  try
  IdHTTP1.HandleRedirects:= True;
  IdHTTP1.ReadTimeout:= 1000;
  for i:=0 to ListBox1.Items.Count -1 do
  begin
    ListBox1.ItemIndex:= i; //zaznaczyć aktualnie pobierana pozycje
    try
    Memo1.Text:= IdHTTP1.Get(ListBox1.Items[i]);
    //tu oczywiscie musisz cos robic bo jak na razie zmieniasz tekst w memo na
    //kod ostatnio pobranej strony
    except
      on E: EIdHTTPProtocolException  do
      begin
       //tu problemy z polaczeniem np. host not found ale zalozenie jest
       //takie ze czego nie da sie pobrac to pomijamy a wiec nic nie robimy
      end//;
      //on E: EIdReadTimeout do
      //begin
       //tu tez zwyczajnie pomijamy wyjatek
      //end
      else
        raise; //pozostale wyjatki skocz do nastepnego bloku obslugi
    end;
  end;
  except
    on E: Exception do
      Application.MessageBox(PAnsiChar(E.Message), PAnsiChar(Application.Title),
      MB_ICONERROR); //tylko pokazac komunikat bledu
  end;
end;
0

a jaka wersje masz indy ?

0
-123oho napisał(a):

sam wiesz, ze nie mozna umiec wszystkiego, no moze Ty akurat wiesz bo piszesz jakbys pozjadal rozumy.

No ba! Pozjadałem wszystkie rozumy bo umiem użyć googla.

Zanim pisze tutaj z jakim kolwiek problemem to przegladam google pod katem mojego problemu.

A wiesz co powinieneś zrobić zanim będziesz pisać swój kod? Ogarniać mechanizmy które stosujesz. Od tego są kursy.

wiem ze to dla was dziecinnie proste ale dla mnie to i tak sukces

Każdy gotowce umie wkleić i poskładać. I o ile wie się co się robi to nie ma problemu. Ale widać ty wklejasz kod, sklejasz go taśmą i myślisz że może zadziała...

na jednym forum sie pomaga a na drugim szuka pomocy.

No niestety ja na żadnych forach nie potrafię znaleźć pomocy.

sam wiesz, ze nie mozna umiec wszystkiego

Wystarczy że się umie pytać googla.

Gdybyś wpisał słowo kluczowe 'exception' + nazwę środowiska w google to otrzymałbyś to: Wyjątki - tam jest napisane czemu tobie ten błąd wyskakuje. No ale przecież ty googla pytałeś i dobrze wiesz że tego tam nie ma, czyż nie? No to dowiedzieliśmy się jeszcze tego że masz problemy z szukaniem w google...

ciezko mi cos znalezc na googlach jesli sie na tym nie znam. jakos jesli cos potrzebuje do sieci to zawsze sobie poszukam. no ale Ty kolego nie mozesz jak to mowisz znalezc na zadnych forach pomocy, widocznie jestes zbyt dobry ze inni ludzie nie potrafia Ci pomoc. tylko sie cieszysz z tego powodu

1

ciezko mi cos znalezc na googlach jesli sie na tym nie znam.

No to skoro się na tym nie znasz to właśnie od tego jest google żeby to poznać. Nie piernicz mi że nie umiesz szukać bo się nie znasz. Poza googlami masz jeszcze pomoc delphi itd. .
No ale ty zamiast grzecznie podziękować za to że pomogłem ci znaleźć informacje wyskakujesz z żalami ani słowem nie mówiąc o tym linku co ci dałem, ba, pewnie nawet nie czytając go.

jakos jesli cos potrzebuje do sieci to zawsze sobie poszukam.

To sobie poszukaj kursów bo ich potrzebujesz.

no ale Ty kolego nie mozesz jak to mowisz znalezc na zadnych forach pomocy, widocznie jestes zbyt dobry ze inni ludzie nie potrafia Ci pomoc. tylko sie cieszysz z tego powodu

Tak, Ty możesz założyć że jestem za dobry dla tego świata. Rzeczywistość jest natomiast taka że jestem na tyle dobry że nie potrzebuję pomocy, bo na wszystkie pytania potrafię znaleźć odpowiedź poprzez eksperymentowanie lub szukanie.

0
-123oho napisał(a):

ciezko mi cos znalezc na googlach jesli sie na tym nie znam.

No to skoro się na tym nie znasz to właśnie od tego jest google żeby to poznać. Nie piernicz mi że nie umiesz szukać bo się nie znasz. Poza googlami masz jeszcze pomoc delphi itd.

Gdybyś miał pojęcie o Delphi to byś wiedział że Help praktycznie milczy na temat Indy i innych komponentów pochodzących od innych firm. Help w nowszych Delphi (właśnie w 7 był ok :) ) jest totalnie zryty i to jest największa wada tego środowiska - nie jesteś online to praktycznie pomocy nie znajdziesz pozostaje wnikanie w źródła klas i komponentów i kombinowanie jak co zrobić.

@n900 nie wiem jak w Indy 9 bo już dawno wywaliłem i mam Indy 10 i ma śmigać bez problemu, próbowałem z adresami stron które nie istnieją, nawet odłączyłem Internet nie sapie żadnymi wyjątkami tylko próbuje dalej po prostu musi działać.

0

Gdybyś miał pojęcie o Delphi to byś wiedział że Help praktycznie milczy na temat Indy i innych komponentów pochodzących od innych firm. Help w nowszych Delphi (właśnie w 7 był ok ) jest totalnie zryty i to jest największa wada tego środowiska - nie jesteś online to praktycznie pomocy nie znajdziesz pozostaje wnikanie w źródła klas i komponentów i kombinowanie jak co zrobić.

Chodziło mi o konstrukcję try..except . Ona też jest żałośnie opisana? No to zawsze jest google. Tłumaczenie 'bo w helpie nie ma' też jest słabe... Jak ktoś chce znaleźć to znajdzie...

0

Ok, kłótnie na bok...

Temat stary, ale mam dokładnie ten sam problem, więc po co nowy wątek tworzyć.

-123, szczerze mówiąc nie mam pojęcia gdzie w podanym przez siebie linku widzisz rozwiązanie naszego problemu?
Jakikolwiek typ wyjątku się przechwyci, HOST NOT FOUND wyskakuje mimo to.

Chodzi Ci o Application.OnException ?
Przeszukałem masę stron z rosyjskimi włącznie i nie udało mi się tego problemu zażegnać, OnException też nic nie dawał, chyba, że po prostu coś pomijałem...

0

Nie ma prawa chyba że w tylko w środowisku projektowym.

  try
  //tu cos
  IDHTTP1.Get('http://aserrtt45.pl'); //nie istniejaca strona
  //tu cos
  except
  //ignoruje wszystkie wyjatki
  end;


  try
  //tu cos
  IDHTTP1.Get('http://aserrtt45.pl'); //nie istniejaca strona
  //tu cos
  except
    on E: EIDException do
    begin
      //ignoruje wszystkie wyjatki indy (w tym host not found )
    end;
    on E: Exception do
      ShowMessage(E.Message); //pozostalych wyjatkow pokazuje komunikat
  end;

Tu tylko w środowisku projektowym pokaże sie błąd a jak nie chcesz aby nawet w środowisku projektowym sie pokazywał to:
Tools -> Debugger Options -> Language Exceptions i tam dodaj rodzaj wyjątku jaki ma się nie pokazywać np. dla wszystkich wyjątków Indy będzie to EIDException

0

-123, szczerze mówiąc nie mam pojęcia gdzie w podanym przez siebie linku widzisz rozwiązanie naszego problemu?
Jakikolwiek typ wyjątku się przechwyci, HOST NOT FOUND wyskakuje mimo to.

No i tak właśnie kończy nie czytanie o problemie do końca. Może zamiast zarzucać mi, że się nie znam, zbadaj dokładnie temat, bo póki co pokazujesz że wiedzy na ten temat nie masz.
Gdybyś poczytał więcej to byś wiedział że debugger przechwytuje wszystkie wyjątki.

0
-321oho napisał(a):

-123, szczerze mówiąc nie mam pojęcia gdzie w podanym przez siebie linku widzisz rozwiązanie naszego problemu?
Jakikolwiek typ wyjątku się przechwyci, HOST NOT FOUND wyskakuje mimo to.

No i tak właśnie kończy nie czytanie o problemie do końca. Może zamiast zarzucać mi, że się nie znam, zbadaj dokładnie temat, bo póki co pokazujesz że wiedzy na ten temat nie masz.
Gdybyś poczytał więcej to byś wiedział że debugger przechwytuje wszystkie wyjątki.

Hmm... Możesz wskazać gdzie też zarzuciłem Ci brak wiedzy?
Teraz to jedynie brak umiejętności czytania ze zrozumieniem mogę Ci zarzucić :)

Co do problemu - sprawa okazała się banalnie prosta, a problemem było nasze zbyt dalekie kombinowanie.
Wystarczy do OnCreate Formy dodać Application.OnException := Procedura;
Następnie w Procedura zadeklarować Sender (TObject) i E (Exception).
Wtedy hulaj dusza - błąd się nie wyświetli, jeśli mu nie nakażemy (ShowException).

0

Hmm... Możesz wskazać gdzie też zarzuciłem Ci brak wiedzy?

Tutaj: -123, szczerze mówiąc nie mam pojęcia gdzie w podanym przez siebie linku widzisz rozwiązanie naszego problemu?
Tak, jestem bardzo wyczulony na niepoprawną krytykę moich myśli czy postów. Zresztą na poprawną też.

Co do problemu - sprawa okazała się banalnie prosta, a problemem było nasze zbyt dalekie kombinowanie.
Wystarczy do OnCreate Formy dodać Application.OnException := Procedura;
Następnie w Procedura zadeklarować Sender (TObject) i E (Exception).
Wtedy hulaj dusza - błąd się nie wyświetli, jeśli mu nie nakażemy (ShowException).

Problem jest jeszcze bardziej banalny niż ci się wydaje. Po prostu ktoś tu nie umie używać debuggera.

0
Dizip napisał(a):

Co do problemu - sprawa okazała się banalnie prosta, a problemem było nasze zbyt dalekie kombinowanie.
Wystarczy do OnCreate Formy dodać Application.OnException := Procedura;
Następnie w Procedura zadeklarować Sender (TObject) i E (Exception).
Wtedy hulaj dusza - błąd się nie wyświetli, jeśli mu nie nakażemy (ShowException).

Ty czytasz poprzednie posty czy bloga prowadzisz i tak sobie tu piszesz? W moim poście wyżej (zresztą nie tylko tym) masz wyraźnie napisane jak to ma wyglądać i MUSI działać nikomu nie wciśniesz że nie działa... ale lepiej zastosować najgorsza z możliwych dla tego przypadku próbę obsłużenia wyjątku.

0
kAzek napisał(a):
Dizip napisał(a):

Co do problemu - sprawa okazała się banalnie prosta, a problemem było nasze zbyt dalekie kombinowanie.
Wystarczy do OnCreate Formy dodać Application.OnException := Procedura;
Następnie w Procedura zadeklarować Sender (TObject) i E (Exception).
Wtedy hulaj dusza - błąd się nie wyświetli, jeśli mu nie nakażemy (ShowException).

Ty czytasz poprzednie posty czy bloga prowadzisz i tak sobie tu piszesz? W moim poście wyżej (zresztą nie tylko tym) masz wyraźnie napisane jak to ma wyglądać i MUSI działać nikomu nie wciśniesz że nie działa... ale lepiej zastosować najgorsza z możliwych dla tego przypadku próbę obsłużenia wyjątku.

MUSI ale NIE działa.

0
Dizip napisał(a):

MUSI ale NIE działa.

Niestety, widać twój brak zrozumienia dla debuggera i mechanizmu wyjątków. Być może za parę lat spojrzysz na swój post i zaśmiejesz się jaki głupi byłeś. Póki co, polecam tobie nie zaprzeczanie bardziej doświadczonym użytkownikom o ile nie masz twardych dowodów.

0
-321oho napisał(a):
Dizip napisał(a):

MUSI ale NIE działa.

Niestety, widać twój brak zrozumienia dla debuggera i mechanizmu wyjątków. Być może za parę lat spojrzysz na swój post i zaśmiejesz się jaki głupi byłeś. Póki co, polecam tobie nie zaprzeczanie bardziej doświadczonym użytkownikom o ile nie masz twardych dowodów.

Najlepszym dowodem dla mnie jest uruchamianie programu spoza IDE i otrzymywanie błędu, którego NIE MOGĘ otrzymać.
Głupi, nie głupi, problem rozwiązany w inny, tak samo głupi (czyt. faktycznie działający) sposób.

Skoro już na poradach jesteśmy, Tobie polecam wyjście na dwór i sprawdzenie jak świeże powietrze smakuje, skoro tak Cię przy ekranie nosi :)
Wiem, wiem... Nie nosi...

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