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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2008, 21:36   #1
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию Вылетает Out of Bounds в коде помогите разобраться

Код:
procedure TForm1.Edit2Change(Sender: TObject);
var i,cnt:word;
begin
 If Edit2.Text<>'' then
   begin
     cnt:=ListBox1.Items.Count-1;
      For i:=0 to cnt do
       If Copy(ListBox1.Items[i],1,Length(Edit2.Text))<>Edit2.Text then  ListBox1.Items.Delete(i);
   end;
end;
Смысле кода: В Edit2 вводится некий текст. Программа проверяет каждый итем в ListBox1 и если начало названия итема и текст в Edit2 не совпадают, то итем удаляется.
Вылетает EStringListError Out of Bounds(3). Строк в ListBox'e 5.
Airou вне форума Ответить с цитированием
Старый 23.07.2008, 21:52   #2
Flenov
Форумчанин
 
Аватар для Flenov
 
Регистрация: 20.06.2008
Сообщений: 168
По умолчанию

Ты удаляешь элемент, а значит, после удаление количество элементов уменьшается. НИКОГДА не делай for для циклов, внутри которых есть даление. Делай всегда while:

Код:
procedure TForm1.Edit2Change(Sender: TObject);   
var i,cnt:word;   
begin  
 If Edit2.Text<>'' then  
   begin  
     cnt := 0;
     while cnt < ListBox1.Items.Count do
      begin
       If Copy(ListBox1.Items[cnt],1,Length(Edit2.Text))<>Edit2.Text then  
         ListBox1.Items.Delete(cnt);   
        else
          Inc(cnt);//Увеличиваем счетчик только если не удаляли
      end;
   end;   
end;
В твоем случае можно было бы уменьшать cnt после каждого удаление, но лучше while
Flenov вне форума Ответить с цитированием
Старый 23.07.2008, 21:59   #3
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Спасибо разобрался...урок на будущее).
Airou вне форума Ответить с цитированием
Старый 23.07.2008, 22:45   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Запомните, можно и For, главное знать как применять:
Код:
procedure TForm1.Edit2Change(Sender: TObject);
var i :word;
begin
 If Edit2.Text<>'' then
 begin
  For i:=ListBox1.Items.Count-1 downto 0 do
  If Copy(ListBox1.Items[i],1,Length(Edit2.Text))<>Edit2.Text then  
   ListBox1.Items.Delete(i);
 end;
end;
Удалять надо с конца, тогда проблем Небудет.
Alter вне форума Ответить с цитированием
Старый 24.07.2008, 09:04   #5
Flenov
Форумчанин
 
Аватар для Flenov
 
Регистрация: 20.06.2008
Сообщений: 168
По умолчанию

Циклы через ж... в смысле с заду наперед не всегда возможны по логике. Можно и спереди, если правильно подходить, но чтобы не думать, правильно ты подходишь или нет, лучше while. На мой взгляд, он проще.
Flenov вне форума Ответить с цитированием
Старый 24.07.2008, 09:56   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Кому как нравится, так и сделает. While не единственный способ .
Alter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При запуске ComboBoxEx пишет List index out of bounds -1. dx+ Общие вопросы Delphi 6 12.06.2008 22:32
Не могу понять почему вылетает 3 процедурка, помогите Taisja Помощь студентам 2 04.06.2008 21:28
Помогите исправить ошибку в коде... prizrak1390 Общие вопросы Delphi 4 26.04.2008 13:19
помогите найти ошибку в коде Joker88 Помощь студентам 1 04.03.2008 12:43