Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TStringList, index out of bounds 
V
    Опции темы
кмс
Дата 4.4.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Здравствуйте. Помогите разобратся что в этом коде не так.
Программа скачивает страницу с инета, извлекает нужные ссылки и выводит их в 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;

PM MAIL   Вверх
Frees
Дата 4.4.2011, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Код

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



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Данкинг
Дата 4.4.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



"files.Count-1" надо, вероятно.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
кмс
Дата 4.4.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



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

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

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

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

Это сообщение отредактировал(а) кмс - 4.4.2011, 15:12
PM MAIL   Вверх
MetalFan
Дата 4.4.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
кмс
Дата 4.4.2011, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Вообщем сделал так.
Код

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
Хотя подозреваю что есть специальные компоненты или что еще для подобных целей.
PM MAIL   Вверх
кмс
Дата 4.4.2011, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Еще есть попутный вопрос. Как сделать что бы в ListBox текст отображался всегда с большой буквы а остальные были все в нижнем регистре?
PM MAIL   Вверх
Snowy
Дата 5.4.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Модератор: Название темы должно отражать ее суть!
Модератор: Пожалуйста, один топик - один вопрос.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.