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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2011, 14:49   #1
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию Работа c SubItems

Извиняюсь за столь нубский вопрос, но сам понять не могу, пользуюсь процедурой удаления пустых записей в ListView, но она почему то храмает, при удалении записи, удаляет дополнительно следуюющею которая не пустая и останавлевается не удаляя остальных. Где я подводных камней не учёл?
Код:
procedure Tform1.proba;
 var
  i,l1,l2:Integer;
begin
  for i:=0 to Listview1.Items.Count -1 do
  begin
    l1:=Length(ListView1.Items[i].SubItems.Strings[i]);  //Check item caption length
  If (l1 = 0) then
  begin
  ListView1.Items[cw].SubItems.Delete(i);
  l2:=i-1;
  ListView1.Items[cw].SubItems.Delete(l2);
  end
  else
  Break;
  end;
end;

Последний раз редактировалось bulldog5293; 18.04.2011 в 15:00.
bulldog5293 вне форума Ответить с цитированием
Старый 18.04.2011, 15:18   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

сейчас не досуг проверить Ваш код,
а что удаляет ...SubItems.Delete я на память не помню.
НО!
Рискну предположить, что тут та же самая беда, которая подстерегает всех, кто делает прямой цикл FOR по структуре, откуда в цикле удаляются записи...

Попробуйте написать не for i:=0 to Listview1.Items.Count -1 do
а
Код:
for i:= Listview1.Items.Count -1 downto 0 do
....
p.s. т.е. внутри стоит прерывание цикла по break - то, возможно, что мой совет и "мимо кассы"... в этом случае прошу, не взыщите строго...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2011, 16:10   #3
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Спс, за оказанную помощь Serge_Bliznykov, но не помогло
bulldog5293 вне форума Ответить с цитированием
Старый 18.04.2011, 16:19   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Где я подводных камней не учёл?

Код:
for i:=0 to Listview1.Items.Count
...
SubItems.Strings[i]
вы высоту с шириной не попутали?

Listview1.Items.Count - число записей в списке (высота)
SubItems.Strings[] - поля записи (ширина)

как их вобще можно индескировать одним индексом?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 18.04.2011, 16:20   #5
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Здравствуйте
Можно сказать продолжение предыдущего сообщения
1. Break - прервёт цикл
Код:
...
for i:=0 to Listview1.Items.Count -1 do
...
2. А если у Вас пробел(ы)
Код:
...
If (l1 = 0) then
...
До свидания

Добавка
3.
Цитата:
//Check item caption length
Это совсем разные вещи caption и SubItems.
4. Если Вы не поняли сообщение veniside, дополнительно поясняю - Вы идёте по диагонали.

Последний раз редактировалось OlegVE; 18.04.2011 в 16:34.
OlegVE вне форума Ответить с цитированием
Старый 18.04.2011, 17:00   #6
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Код:
вы высоту с шириной не попутали?
Извеняюсь забыл, переделал так, но работает один раз почему то
Код:
var
i,j2, z2:integer;
begin
  for i:=0 to BBUX.Listview1.Items[cw].SubItems.Count -1 do
j2:=3;//к примеру
  if (Length(BBUX.Listview1.items[cw].SubItems.strings[j2]) = 0)
                then
                with BBUX.Listview1.items[cw] do
begin
                  if j2 > -1 then
                    SubItems.Delete(j2);
                  z2 := j2 - 1;
                  Count := Count - 1;
                  if z2 > -1 then
                    SubItems.Delete(z2);
                  j2 := j2 + 3;
               end;
end;

Последний раз редактировалось bulldog5293; 18.04.2011 в 17:02.
bulldog5293 вне форума Ответить с цитированием
Старый 18.04.2011, 17:12   #7
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Попробуйте хоть раз в жизни нажать F7
Прощайте
P.S. Не забудьте про Add Watch
OlegVE вне форума Ответить с цитированием
Старый 18.04.2011, 17:17   #8
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Код:
 Попробуйте хоть раз в жизни нажать F7
Характеристики железа не позволяют
bulldog5293 вне форума Ответить с цитированием
Старый 18.04.2011, 18:48   #9
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Это как? Кнопок на клаве не хватает? Так клавиши переназначить можно.
eduard93 вне форума Ответить с цитированием
Старый 18.04.2011, 19:14   #10
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Полностью вырубается Delphi XE от того что Pentium 3
Цитата:
сейчас не досуг проверить Ваш код,
а что удаляет ...SubItems.Delete я на память не помню.
НО!
Рискну предположить, что тут та же самая беда, которая подстерегает всех, кто делает прямой цикл FOR по структуре, откуда в цикле удаляются записи...

Попробуйте написать не for i:=0 to Listview1.Items.Count -1 do
а
Код:

for i:= Listview1.Items.Count -1 downto 0 do
....

p.s. т.е. внутри стоит прерывание цикла по break - то, возможно, что мой совет и "мимо кассы"... в этом случае прошу, не взыщите строго...
Всё таки не мимо кассы, спс помогло

Последний раз редактировалось bulldog5293; 19.04.2011 в 17:47.
bulldog5293 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск по subitems bulldog5293 Общие вопросы Delphi 3 15.02.2011 19:17
SubItems.Delete bulldog5293 Общие вопросы Delphi 6 09.11.2010 11:01
ListView SubItems mutabor Компоненты Delphi 0 19.08.2010 14:38