Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2015, 18:26   #1
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
Вопрос Помогите найти ошибку

Есть список (TStringList) состоящий из разных слов

Цитата:
собака
кошка
лошадь
корова
кошка
лошадь
собака
корова
собака
...
Нужно вывести в ListView сколько раз в этом списке встречается каждое слово.
Написал следующий код, выводит правильно несколько записей и вылетает с ошибкой List out of bounds.
Помогите найти причину ошибки.


Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  i, j, C, All: integer;
  S: string;
  NewItem: TListItem;
begin
 with TStringList.Create do
 try
  LoadFromFile('spisok.txt');
  ListView5.Items.BeginUpdate;
  All:= Count-1;
  for i:=0 to All do
  begin
   S:= Strings[i];
   C:= 0;
   for j:=All downto 0 do
   begin
    if Strings[j] = S
    then
    begin
     Inc(C);
     Delete(j);
     All:= Count-1;
    end;
   end;
   NewItem:= ListView5.Items.Add();
   NewItem.Caption:= S;
   NewItem.SubItems.Add(IntToStr(C));
  end;
 finally
  Free;
 end;
  ListView5.Items.EndUpdate;
end;
garuna вне форума Ответить с цитированием
Старый 07.02.2015, 18:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  i, j, C, All: integer;
  S: string;
  NewItem: TListItem;
begin
 with TStringList.Create do
 try
  LoadFromFile('spisok.txt');
  ListView5.Items.BeginUpdate;
  while Count>0 do  begin
   S:= Strings[i];
   NewItem:=ListView5.FindCaption(0,s,false,false,false);
   if NewItem<>nil then NewItem.SubItems[0]:=IntToStr(StrToInt(NewItem.SubItems[0]))
   else begin
    NewItem:= ListView5.Items.Add();
    NewItem.Caption:= S;
    NewItem.SubItems.Add('0');
   end;
   delete(i);
  end;
 finally
  Free;
 end;
  ListView5.Items.EndUpdate;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.02.2015, 18:38   #3
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Stilet,

То же самое, List index out of bounds. Смотрю через MadExcept, указывает на строку S:= Strings[i];
garuna вне форума Ответить с цитированием
Старый 07.02.2015, 18:48   #4
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

зачем удалять строки? чтобы программа подтормаживала?
lomastr_ вне форума Ответить с цитированием
Старый 07.02.2015, 19:00   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Смотрю через MadExcept, указывает на строку S:= Strings[i];
Это мой косяк: S:= Strings[0]; и delete(0);
Цитата:
зачем удалять строки?
Напиши свой вариант без удаления )
Я же не против.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.02.2015, 19:04   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Stilet, а откуда i взялось?
northener вне форума Ответить с цитированием
Старый 07.02.2015, 19:08   #7
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Stilet, Теперь без ошибок, но выводит нули. Что это за странная строка NewItem.SubItems[0]:=IntToStr(StrToInt(NewItem.SubItem s[0])) ?
lomastr_, потому что список большой и нет смысла обрабатывать ненужные строки всякий раз

Последний раз редактировалось garuna; 07.02.2015 в 19:12.
garuna вне форума Ответить с цитированием
Старый 07.02.2015, 20:08   #8
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Вместо Memo1 используй TStringList. Я так и не понял - это нужно?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
a, i, n, m: integer;
begin
n:= 0;
m:= Memo1.Lines.Count -1;
for a:= 0 to Memo1.Lines.Count -1 do
  begin
    for i:= a to Memo1.Lines.Count -1 do
    if Memo1.Lines[a] = Memo1.Lines[i] then
    Inc(n);
    if m > 0 then
       ListView1.AddItem(Memo1.Lines[a]+'  '+ IntToStr(n), Memo1);
        m:= m - n;
        n:=0;
    end;
  end;
end.
Iron Monk вне форума Ответить с цитированием
Старый 07.02.2015, 20:41   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а откуда i взялось?
Я просто не убирал из кода автора лишнее.
Цитата:
выводит нули
Забыл койче: NewItem.SubItems[0]:=IntToStr(1+StrToInt(NewItem.SubIt em s[0])) ?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.02.2015, 20:46   #10
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Stilet, не работает.
Iron Monk, это не то.
garuna вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти седловые точки в матрице(помогите найти ошибку) - pascal tdsotm Помощь студентам 0 20.11.2014 18:57
Помогите найти ошибку - StrToFloat выдаёт ошибку EConvertError для ячеек StringGrid (Delphi) Artsiom Помощь студентам 10 18.12.2013 14:10
Помогите найти ошибку orandzheviyman Паскаль, Turbo Pascal, PascalABC.NET 3 11.12.2013 23:19
Помогите найти ошибку на С nicheel Помощь студентам 4 07.12.2013 00:05