Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > TStringList


Автор: кмс 4.4.2011, 14:42
Здравствуйте. Помогите разобратся что в этом коде не так.
Программа скачивает страницу с инета, извлекает нужные ссылки и выводит их в Memo.
Первую ссылку выводит нормально, но как доходит до строки со второй ссылкой то вылетает с ошибкой - List index out of bounds (5)
Если просто загружаю код скачанной страницы в Memo и делаю поиск в нем, то все работает нормально, а вот с TStringList не получается.
Спасибо.

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  hht: string;
  files: TStrings;
  s: string;
  I: Integer;
begin
  if Edit1.Text <> '' then
  begin
    s := IdHTTP1.Get('http://engine-codes.com/search_codes.php?var=' + Edit1.Text);
    s := Copy(s, pos('<!-- Content Starts -->', s), pos('<!-- Content Ends -->',
      s) - pos('<!-- Content Starts -->', s) + 21);
    files := TStringList.Create;
    files.Text := s;

    for I := 0 to files.Count do
    begin
      if pos('href="', files.Strings[I]) > 0 then
      begin
        hht := Copy(files.Strings[I], pos('href="', files.Strings[I]) + 6,
          pos('.html">', files.Strings[I]) - pos('href="', files.Strings[I]) - 1);
        Memo1.Lines.Add(hht);
      end;
    end;
     files.Free;
  end
  else
    ShowMessage('Введите код ошибки');
end;

Автор: Frees 4.4.2011, 15:05
Код

for I := 0 to files.Count - 1 do

Автор: Данкинг 4.4.2011, 15:06
"files.Count-1" надо, вероятно.

Автор: кмс 4.4.2011, 15:09
Вроде понял в чем проблема. Что бы ошибка не выскакивал надо цикл написать так
Код

for I := 0 to files.Count - 1 do

Но это я сам лоханулся, когда делал с Memo все было правильно написано.
Теперь работает, но извлекает только одну ссылку, но тут тоже оказалось что, тот кусок html кода откуда надо извлечь ссылки записан одной строкой smile
В принципе можно и дальше загружать в Memo и работать с ним, но может оказатся что нужная ссылка может быть разбита на две строки.
Тогда вопрос меняется, как сделать то что мне нужно? smile 

Данкинг, Frees точно. smile

Автор: MetalFan 4.4.2011, 17:27
А зачем вообще грузить текст в стринглист? может сразу pos'ом пройтись по полученной строке? или регулярками)

Автор: кмс 4.4.2011, 20:05
Вообщем сделал так.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  hht, h, s: string;
  I, ps, pe: Integer;
  files: TStrings;
begin
  if Edit1.Text <> '' then
  begin
    ///////////////////Получение списка ошибок и извлечение ссылок/////////////
    s := IdHTTP1.Get('http://engine-codes.com/search_codes.php?var=' +
      Edit1.Text);
    s := Copy(s, pos('<!-- Content Starts -->', s), pos('<!-- Content Ends -->',
      s) - pos('<!-- Content Starts -->', s) + 21);

    files := TStringList.Create;
    while ps <> 0 do
    begin
      ps := Pos('href="', s);
      pe := Pos('.html', s);
      if ps > 0 then
      begin
        hht := Copy(s, ps + 6, pe - ps - 1);
        files.Add(hht);
        Delete(s, 1, pe + 5);
      end;
    end;
    files.SaveToFile('temp');
    files.Free;
  end
  else
    ShowMessage('Введите код ошибки');
end;

Может и кривовато, но вроде работает smile
Хотя подозреваю что есть специальные компоненты или что еще для подобных целей.

Автор: кмс 4.4.2011, 21:35
Еще есть попутный вопрос. Как сделать что бы в ListBox текст отображался всегда с большой буквы а остальные были все в нижнем регистре?

Автор: Snowy 5.4.2011, 11:10
Модератор: Название темы должно отражать ее суть!
Модератор: Пожалуйста, один топик - один вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)