powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поменял Memo на TStringList
14 сообщений из 14, страница 1 из 1
Поменял Memo на TStringList
    #39455228
applauser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Парсю html. Есть такой кусок:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
s := Idhttp.Get('какой то сайт');

re1 := TRegExp.Create;
lst1 := TStringList.Create;
	  
re1.Expression := 'center valign=middle>(.*?)</TD>';	//регуляркой получаем список значений
if re1.Exec(s) then
   repeat
      lst1.Add(Trim(re1.Match[1]));
   until not re1.ExecNext;
ch_lst.Text := lst1.Text;	//отправляем все в Memo
ch_lst.Lines.Add('Наверх</a></b></');	//добавляем туда еще одну строку

i := 0; 	//удаляем дубликаты в Memo
while i < ch_lst.Lines.Count do
   begin
      if ch_lst.Lines.IndexOf(ch_lst.Lines[i]) < i then
         ch_lst.Lines.Delete(i)
      else
         inc(i);
   end;

l := 1;
for i := 0 to ch_lst.Lines.Count - 1 do
   begin
      t := copy(s, pos(ch_lst.Lines[i], s), pos(ch_lst.Lines[i + 1], s) - pos(ch_lst.Lines[i], s));	//выделяем hmtl между двумя соседними значениями в списке
      j := CntRecurrences('''65%'' valign=middle>', t);	//подсчёт количества
      for k := l to l + j + 1 do
         events_line.Cells[1, k] := ch_lst.Lines[i];  	//вставка в StringGrid
      l := l + j; 	//запоминаем позицию
end;


Тут всё работает с Memo. Меня всё на TString List (то есть оставляю на lst1) - вываливается с ошибкой List index out of bound и тд. Разве методы у Memo с StringList не одинаковы? Что не так?
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455239
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
applauserЧто не так?
For вычисляет пределы цикла один раз. А ты в цикле удаляешь строки по-живому. Естественно
в конце оно неизбежно вылезет за границы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455262
applauser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Немного не понял вас. Вышеуказанный код работает.
А вот этот не работает, хотя особо ничего не менял по сути:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
s := Idhttp.Get('какой то сайт');

re1 := TRegExp.Create;
lst1 := TStringList.Create;
     
re1.Expression := 'center valign=middle>(.*?)</TD>';   //регуляркой получаем список значений
if re1.Exec(s) then
   repeat
      lst1.Add(Trim(re1.Match[1]));
   until not re1.ExecNext;
lst1.Add('Наверх</a></b></');               //добавляем туда еще одну строку

i := 0;                                     //удаляем дубликаты
while i < lst1.Count do
   begin
      if lst1.IndexOf(lst1.Strings[i]) < i then
         lst1.Delete(i)
      else
         inc(i);
   end;

l := 1;
for i := 0 to lst1.Count - 1 do
   begin
      t := copy(s, pos(lst1.Strings[i], s), pos(lst1.Strings[i + 1], s) - pos(lst1.Strings[i], s));   //выделяем hmtl между двумя соседними значениями в списке
      j := CntRecurrences('''65%'' valign=middle>', t);                                              //подсчёт количества
      for k := l to l + j + 1 do
         events_line.Cells[1, k] := lst1.Strings[i];                                      //вставка в StringGrid
      l := l + j;                                                                //запоминаем позицию
end;
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455277
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
applauser,

в TStringList есть встроенный механизм работы с дубликатами. Реакция определяется вроде через Duplicates.
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455282
applauser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Так там сортировка обязательно, если не ошибаюсь. В моем случае нужно сохранить порядок
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455294
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
applauserРазве методы у Memo с StringList не одинаковы? Что не так?

Нет .

Наводящие вопросы:
какой код проверяет диапазон и выбрасывает List index out of bound?

чему равно ch_lst.Lines[i + 1] при i = ch_lst.Lines.Count - 1?
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455295
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
applauser,

тогда иди снизу вверх либо проверяй перед добавлением.
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455313
applauser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker,

Дело не в ширине Memo. Там достаточная ширина - все элементы списка помещаются в одну строку.

Сейчас Delphi под рукой нет, вечером посмотрю.
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455531
applauser1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашёл тупую ошибку:
В последнем цикле for в последней итерации я ссылался на несуществующий элемент списка - изменил "ch_lst.Lines.Count - 1" на "ch_lst.Lines.Count - 2" и всё заработало.
Всем спасибо.
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455535
applauser1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
s := Idhttp.Get('какой то сайт');

re1 := TRegExp.Create;
lst1 := TStringList.Create;
     
re1.Expression := 'center valign=middle>(.*?)</TD>';   //регуляркой получаем список значений
if re1.Exec(s) then
   repeat
      lst1.Add(Trim(re1.Match[1]));
   until not re1.ExecNext;
lst1.Add('Наверх</a></b></');               //добавляем туда еще одну строку

i := 0;                                     //удаляем дубликаты
while i < lst1.Count do
   begin
      if lst1.IndexOf(lst1.Strings[i]) < i then
         lst1.Delete(i)
      else
         inc(i);
   end;

l := 1;
for i := 0 to lst1.Count - 2 do
   begin
      t := copy(s, pos(lst1.Strings[i], s), pos(lst1.Strings[i + 1], s) - pos(lst1.Strings[i], s));   //выделяем hmtl между двумя соседними значениями в списке
      j := CntRecurrences('''65%'' valign=middle>', t);                                              //подсчёт количества
      for k := l to l + j - 1 do
         events_line.Cells[1, k] := lst1.Strings[i];                                      //вставка в StringGrid
      l := l + j;                                                                //запоминаем позицию
end;
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455555
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочешь опять нарваться? Тебе же дали четкий ответ:
автортогда иди снизу вверх либо проверяй перед добавлением.
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455564
applauser1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Любезный,

не нарвусь, уже спарсил всё, что нужно было. Согласен - это костыль.
Снизу вверх не подходит, уже говорил, что важен текущий порядок в списке.
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455567
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
applauser1Снизу вверх не подходит, уже говорил, что важен текущий порядок в списке.
Он и не нарушится, т.к. indexof возвращает первое вхождение независимо от.
...
Рейтинг: 0 / 0
Поменял Memo на TStringList
    #39455613
applauser1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

Я думал, вы про другой цикл говорили:
Код: pascal
1.
2.
3.
4.
5.
for i := lst1.Count - 1 downto 0 do       //удаление дубликатов
   begin
      if lst1.IndexOf(lst1.Strings[i]) < i then
         lst1.Delete(i)
   end;


Но это же не решало мою первоначальную проблему.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поменял Memo на TStringList
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]