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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2009, 22:14   #1
Velross
Пользователь
 
Регистрация: 09.12.2009
Сообщений: 10
По умолчанию Почему строки в компоненте ListBox программно удаляются, а визуально нет?

Стоит задача обработать список, найти в нём ключевые слова и удалить всё от первого ключевого слова до последнего.
Я делаю так:
Код:
for i:=0 to ListBox1.Items.Count-1 do  begin
if ListBox1.Items[i]='Key1' then
A:=i;
if ListBox1.Items[i]='Key2' then
B:=i;
end;

for i:=A to B do 
ListBox1.Items.Delete(i);
Потом вывожу в Label кол-во элементов списка, в Label показывается, что в списке элементов стало меньше, а реально в списке ничего не удалилось.
Пробовал и Refresh, Update, но все без изменений.

Delphi 7.

Последний раз редактировалось Stilet; 10.12.2009 в 08:11.
Velross вне форума Ответить с цитированием
Старый 09.12.2009, 22:30   #2
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

После удаления перерисуй
ListBox1.Update;
Цитата:
Сообщение от Velross Посмотреть сообщение
Пробовал и Refresh, Update, но все без изменений.

Последний раз редактировалось mihali4; 09.12.2009 в 22:58.
s.Creator вне форума Ответить с цитированием
Старый 09.12.2009, 22:51   #3
Noor
Участник клуба
 
Аватар для Noor
 
Регистрация: 01.11.2006
Сообщений: 1,051
По умолчанию

У меня все работает !
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 A,B,i:Integer;
  begin
   for i:=0 to ListBox1.Items.Count-1 do
     begin
      if ListBox1.Items[i]='Key1' then
        A:=i;
      if ListBox1.Items[i]='Key2' then
        B:=i;
    end;
      for i:=A to B do
        ListBox1.Items.Delete(i);
        Label1.Caption := IntToStr(ListBox1.Items.Count);
end;
Вложения
Тип файла: rar Project1.rar (151.3 Кб, 9 просмотров)
Noor вне форума Ответить с цитированием
Старый 09.12.2009, 22:59   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

У меня тоже.
ТС, попробуйте перезапустить Дельфи - если она "здорова", все станет нормально.
mihali4 вне форума Ответить с цитированием
Старый 10.12.2009, 06:25   #5
Velross
Пользователь
 
Регистрация: 09.12.2009
Сообщений: 10
По умолчанию

Не знаю чё был за глюк, но почему-то я не догадался перезапустить Делфи, а сегодня утром попробовал и все заработало. Чертавщина какая-то.

Но это не все. Допустим, в элементе 242 строчки,при цикле:
Код:
for i:=0 to 242 do
ListBox1.Items.Delete(i);
По идеи, элемент должен полностью очиститься, но на деле строки уменьшаются только в 2 раза: 211, при повторном нажатии кнопки 105, 52, 26, 13, 6, 3, 1, 0.

Что за фигня?

Последний раз редактировалось Velross; 10.12.2009 в 06:40.
Velross вне форума Ответить с цитированием
Старый 10.12.2009, 08:11   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Рекомендуется так:
Код:
for i:=242 downto 1 do
ListBox1.Items.Delete(i);
Или еще проще ListBox1.Items.Clear
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2009, 13:40   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Velross Посмотреть сообщение
По идее, элемент должен полностью очиститься, но на деле строки уменьшаются только в 2 раза: 211, при повторном нажатии кнопки 105, 52, 26, 13, 6, 3, 1, 0.
Я уже объяснял одному товарищу. Повторю.
Когда вы удаляете, допустим, пятую строку, на ее место становится шестая, а ваш счетчик цикла перескакивает ее и дальше удаляет седьмую, стоящую теперь на месте шестой.
Так что никакой мистики...
mihali4 вне форума Ответить с цитированием
Старый 10.12.2009, 19:35   #8
Velross
Пользователь
 
Регистрация: 09.12.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Рекомендуется так:
Код:
for i:=242 downto 1 do
ListBox1.Items.Delete(i);
Или еще проще ListBox1.Items.Clear
Большое спасибо за дельный совет. Так все работает как надо.

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Я уже объяснял одному товарищу. Повторю.
Когда вы удаляете, допустим, пятую строку, на ее место становится шестая, а ваш счетчик цикла перескакивает ее и дальше удаляет седьмую, стоящую теперь на месте шестой.
Так что никакой мистики...
Спасибо за разъяснения. Действительно не знал этого.
Velross вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему нет нормальных программ переводчиков иностранных языков veter_s_morya Свободное общение 3 26.09.2009 12:07
Помогите визуально переработать прожку на С++ Olya90 Помощь студентам 6 21.09.2009 21:17
Почему на форуме нет ветки Пролог? veter_s_morya О форуме и сайтах клуба 9 29.05.2008 18:35
Canvas в компоненте ListBox Миша Общие вопросы Delphi 3 24.09.2007 20:38