Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 10.05.2011, 11:54   #1
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию удаление дубликатов в ListView

удаление дубликатов в ListView

Всем здрасти.
Помогите разобраться почему такое происходит
вот код удаления дублей строк в ListView
Код:
if ListView1.Items.Count>0 then
  for i:=ListView1.Items.Count-1 downto 1 do
    for j:=i-1 downto 0 do
      if ListView1.Items[i].SubItems.Strings[0]=ListView1.Items[j].SubItems.Strings[0] then
        ListView1.Items[j].Delete;
выдает ощибку, смотрю в отладчике изначально ListView1.Items.Count-1 = 15 соответственно i=15
удаляется строка ListView1.Items.Count-1 стал равен 14 однако i осталось равна 15 и соответственно ошибка т.к.
обратились к несюществующей строке.
сделал так
Код:
if ListView1.Items.Count>0 then
  for i:=ListView1.Items.Count-1 downto 1 do begin
str:=ListView1.Items[i].SubItems.Strings[0];
    for j:=i-1 downto 0 do
      if str=ListView1.Items[j].SubItems.Strings[0] then
        ListView1.Items[j].Delete;
end;
и опять ошибка, сново смотрю в отладчик, идет удаление дублей соответственно меняется ListView1.Items.Count
фактически ListView1.Items.Count=5 а i=14 вот почему так????!!!??

этот же алгоритм в memo работает на ура.
fate вне форума Ответить с цитированием
Старый 11.05.2011, 12:34   #2
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

кто нить...
fate вне форума Ответить с цитированием
Старый 11.05.2011, 13:33   #3
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Код:
i:=ListView1.Items.Count-1;
while i >= 0 do begin
  str:=ListView1.Items[i].SubItems.Strings[0];
  for j := i - 1 downto 0 do
    if str = ListView1.Items[j].SubItems.Strings[0] then begin
        ListView1.Items[j].Delete;
        Dec(i);
    end;
  Dec(i);
end;
____________
А ЧТО - КОД ОБРАМИТЬ ТЕГАМИ, КАК ТОГО ТРЕБУЮТ ПРАВИЛА - СЛИШКОМ СЛОЖНО?!!
ИЛИ ДОЛГО?!!
ИЛИ НЕ ЦАРСКОЕ ЭТО ДЕЛО - КОД ПО ПРАВИЛАМ ОФОРМЛЯТЬ?!
:-[

Модератор.

Извините...

Последний раз редактировалось ReportCube; 11.05.2011 в 17:41. Причина: Извинения
ReportCube вне форума Ответить с цитированием
Старый 11.05.2011, 17:24   #4
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

через while понятно что можно (наверное так и сделаю)
но все же очень интересно почему i в счетчике так себя странно ведет
fate вне форума Ответить с цитированием
Старый 11.05.2011, 17:29   #5
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Здравствуйте
Цитата:
Сообщение от fate Посмотреть сообщение
1) через while понятно что можно (наверное так и сделаю)
2) но все же очень интересно почему i в счетчике так себя странно ведет
1) Так и делайте через while! 2) Вначале инициализируется цикл for. И чего же Вы хотите...
До свидания
OlegVE вне форума Ответить с цитированием
Старый 12.05.2011, 13:26   #6
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

Цитата:
Сообщение от OlegVE Посмотреть сообщение
Вначале инициализируется цикл for.
и что ))
это не причина, ты внимательно прочитал мой топик?
fate вне форума Ответить с цитированием
Старый 12.05.2011, 13:38   #7
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Вначале инициализируется цикл for i :=. Во втором Вашем цикле значение i не изменяется и не должно изменяться. И чего же Вы хотите...
ReportCube вне форума Ответить с цитированием
Старый 12.05.2011, 16:08   #8
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

ReportCube внимательно читаем
Цитата:
сделал так
Код:
if ListView1.Items.Count>0 then
  for i:=ListView1.Items.Count-1 downto 1 do begin
str:=ListView1.Items[i].SubItems.Strings[0];
    for j:=i-1 downto 0 do
      if str=ListView1.Items[j].SubItems.Strings[0] then
        ListView1.Items[j].Delete;
end;
за время выполнение цикла
for j:=i-1 downto 0 do
количество строк уменьшилось с 15 до 4. Цикл
for j:=i-1 downto 0 do закончил обработку и программа перешла к циклу
for i:=ListView1.Items.Count-1 downto 1 do begin
на данный момент ListView1.Items.Count-1 равен 4, по идее на следующем шаге в переменную str должна попасть строка с индексом 4, но этого не происходит т.к. i остается быть равной 15.
Так о какой нах инициализации вы говорите?
fate вне форума Ответить с цитированием
Старый 12.05.2011, 16:51   #9
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Ещё раз: инициализация счётчика в цикле For происходит при его старте!!! Далее счётчик, по умолчанию, изменяется на единицу. Ему абсолютно безразлично изменения ListView1.Items.Count, как бы Вы о нём не думали.
ReportCube вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление дубликатов Deltist Microsoft Office Excel 11 14.01.2011 17:01
удаление текста из listview bulldog5293 Общие вопросы Delphi 1 13.08.2010 08:56
поиск дубликатов файлов(имя, тип, размер). Вывод дубликатов на экран с отображением их пути faraon1792 Помощь студентам 4 20.03.2010 00:46
Удаление Items в ListView BioHEX Общие вопросы Delphi 1 04.01.2010 20:43
удаление дубликатов и группировка строк Serglen Microsoft Office Excel 2 30.07.2008 15:51