[Delphi] Kod, który nie wykonuje się za 1 razem, a za 2 ta

0

Witam

Mam napisaną taką procedurę, która wyciąga linki z plików podanych w ListBox_FileList. Sprawdzałem z kompilatorem i program wchodzi do pierwszej pętli, wykonuje procedurę "Navigate", ale nie wchodzi do drugiej pętli, gdzie powinien zliczyć ilość linków w WebBrowser. Dopiero jak drugi raz wywołam procedurę wykonuje się prawidłowo - czyli w drugiej pętli for jest zliczona ilość linków, zmienna Link przyjmuje kolejne wartości, funkcja Pos sprawdza warunek i dodaje linki spełniające kryterium do drugiej listy.

Jaka jest tego przyczyna ?

 
  for i := 0 to MainForm.ListBox_FileList.Items.Count - 1 do begin
    MainForm.WebBrowser.Navigate(Dir + MainForm.ListBox_FileList.Items[i]);
    for j := 0 to MainForm.WebBrowser.OleObject.Document.Links.Length - 1 do begin
      Link := MainForm.WebBrowser.OleObject.Document.Links.Item(j).Href;
      if (Pos(MainForm.Edit1.Text, Link) > 0) then
          MainForm.ListBox_LinkList.Items.Add(Link);    
    end;
  end;

Pozdr

Wesołych i radosnych Świąt !!

0

spróbuj tak:

for i := 0 to MainForm.ListBox_FileList.Items.Count do begin

lub

for i := 1 to MainForm.ListBox_FileList.Items.Count - 1 do begin
0

Wydaje mi się, że nie jest to raczej problem indeksów.
Być może coś z WebBrowser'em, ponieważ za pierwszym razem jak kliknę Button'a wywołującego tą metodę to kompilator omija drugą pętlę (tak jakby nie było linków albo nic się do WebBrowser'a nie załadowało), ale jak kliknę ponownie to się wszystko prawidłowo wykonuje.

0
for i := 0 to MainForm.ListBox_FileList.Items.Count - 1 do begin
    MainForm.WebBrowser.Navigate(Dir + MainForm.ListBox_FileList.Items[i]);
    for j := 0 to MainForm.WebBrowser.OleObject.Document.Links.Length - 1 do begin
      Link := MainForm.WebBrowser.OleObject.Document.Links.Item(j).Href;
      if (Pos(MainForm.Edit1.Text, Link) > 0) then
          MainForm.ListBox_LinkList.Items.Add(Link);   
    end;
  end;

Wydaje mi się, że problem leży w Navigate. Wywołujesz tę metodę, ale następna pętla for zaczyna się wykonywać zanim strona zostanie załadowana do końca. Powinieneś ją chyba przenieść do WebBrowser.OnDocumentComplete.

0

Dzięki wielkie za podpowiedź, działa jak powinno.
Rozwiązałem to tak:

GetNext - publiczna zmienna typu Boolean

procedure TGetFiles.GetLinks;
var
  i, j: Integer;
begin
  MainForm.ListBox_LinkList.Items.Clear;
  for i := 0 to MainForm.ListBox_FileList.Items.Count - 1 do begin
    GetNext := True;
    MainForm.WebBrowser.Navigate(Dir + MainForm.ListBox_FileList.Items[i]);
    while GetNext do Application.ProcessMessages;
  end;
end;

procedure TMainForm.WebBrowserDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  Ile, j: Integer;
  Link: String;
begin
  Ile := StrToInt(Label_LinkCount.Caption);
  for j := 0 to MainForm.WebBrowser.OleObject.Document.Links.Length - 1 do begin
    Link := MainForm.WebBrowser.OleObject.Document.Links.Item(j).Href;
    if (Pos(MainForm.Edit_TextInLink.Text, Link) > 0) and not GetFiles.LinkExists(Link) then begin
      MainForm.ListBox_LinkList.Items.Add(Link);
      Inc(Ile);
      Label_LinkCount.Caption := IntToStr(Ile);
      Label_LinkCount.Refresh;
    end;
  end;
  GetFiles.GetNext := False;
end;

Wszystko fajnie się ładuje i zlicza :)

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