Laczenie z linkami z listboxa

0

witam, walcze caly dzien moim programem, ktory z listboxa ma ladowac kazda strone po kolei. laduje strone, konczy ladowanie i nastepna. leci tak cala lista z gory na dol. na dzien dzisiejszy mam takie cos:

var
  HTML : String;
  i : integer;
begin
try
  http.ConnectTimeout := 5000;

  for i := 0 to ListBox1.Items.Count - 1 do
  HTML := HTTP.Get(ListBox1.Items.Strings[ListBox1.ItemIndex]); // pobranie kodu HTML

 except
  on Exception do
  Begin
  ShowMessage('Problemy z połączeniem: '+ListBox1.Items.Strings[ListBox1.ItemIndex]);
  Http.DisconnectSocket;

    end;

Mam problem z petla bo staje mi na zaznaczonej pozycji i laduje sie w kolko. A chcialbym zeby wczytywana byla kazda pozycji z gory na dol. Prosze o pomoc

0

Zobacz jaki item ładujesz, a jaki powinieneś.

0
  1. Imo .Strings jest zbędne bo to domyślne property dla Items. 2. Poczytaj do czego służy wartośc ItemIndex i zmień pętle tak aby działało. 3. Nieprecyzyjnie piszesz. Można wnioskowac, że chcesz ładowac treść jakiejś strony, a domyślam się z kodu, że w ListBoxie swoją drogą - geniealnie nazwanym - znajdują się odnośniki do stron www.

EDIT: rozpisałem się i dzięki temu @Patryk27 był szybszy.

0

Powalczylem i mam takie cos aktualnie:

var
Selected : string;
i : integer;
begin
try



for i:=0 to ListBox1.Items.Count-1 do begin
Selected := ListBox1.Items.Strings[ListBox1.ItemIndex];

http.ConnectTimeout := 5000;

HTTP.Get(Selected);
form1.Text :=  http.Host;

ListBox1.ItemIndex:=i;

end;
 except
  on Exception do
  Begin
  ShowMessage('Problemy z połączeniem: '+ListBox1.Items.Strings[ListBox1.ItemIndex]);
  Http.DisconnectSocket;

    end;
 end;

w petli zaznacza kazda pozycje i niby sie laczy jednak po 5 pozycji otrzymuje blad: HTTP/1.1 301 Moved Permanently

0

w petli zaznacza kazda pozycje i niby sie laczy jednak po 5 pozycji otrzymuje blad: HTTP/1.1 301 Moved Permanently

To nie błąd.

0

O ile dobrze widzę nie ustawiasz ItemIndex na starcie, a więc jak nie zaznaczysz żadnego item przed wykonaniem pętli to jest on równy -1, według mne należało by to poprawić. A kod 301 to nie jest błąd jak napisał poprzednik - tylko informacja od serwera o przekierowaniu na inny adres. I również: o ile coś jeszcze pamiętam z Indy, to jest tam gotowy mechanizm obsłużenia przekierowań, bodajże własność ta zwie się HandleRedirects, ale to sprawdź w dokumentacji.

0

powalczylem dalej i aktualnie kod mam taki:

var
Selected : string;
i : integer;

  HTML : String;
begin
listbox1.ItemIndex := 0;
try



for i:=0 to ListBox1.Items.Count-1 do begin
Selected := ListBox1.Items.Strings[ListBox1.ItemIndex];

http.HandleRedirects:=false;
http.ConnectTimeout := 1000;

HTTP.Get(Selected);

      HTML := HTTP.Get(selected);
      form1.memo1.Lines.Text := HTML;

ListBox1.ItemIndex:=i;

problem pojawia sie z witrynami ktrore strasznie dlugo sie laduja lub nie odpowiadaj w ogóle otrzymuje wtedy komunikat:

EidReadTimeout with message "Read Timeout"

Czyli przekroczony czas oczekiwania - jak sie domyslam

Moje pytanie, jak moge sprawic by moj program jesli pojawi sie timeout nie przestanie dzialac ? a jedynie pominie nieodpowiadajace strone i bedzie petla dzialac dalej?

0

Uruchamiać z poza IDE albo wyłączyć reakcję na wyjątki. I obsłużyć ten wyjątek EidReadTimeout w razie potrzeb żeby na przykład nic nie pokazywał. Ale z tym kombinuj sam, ja nie korzystam z Indy od bardzo dawna.

0

@jupil4 po pierwsze zrobiłeś dokładnie odwrotnie HandleRedirects powinieneś ustawić na True (przecież przekierowania mają być automatycznie obsługiwane). Po drugie w ostatnim kodzie widzę że 2 razy pobierasz stronę (tylko raz w kosmos bo nigdzie nie wykorzystujesz zwróconego dokumentu) tu przykład jak obsługiwać te wyjątki:

//do uses IdStack, IdExceptionCore
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: EIdSocketError 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;

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