Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Где моя ошибка? [D6, WinXP]


Ross ©   (2002-04-27 19:22:00) 

Помогите. Не могу разобраться:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
i:integer;
begin
i:=0;
try
if MessageDlg("Confirm!",
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
for i:=0 to RxCheckListBox1.Items.Count-1 do
begin
if RxCheckListBox1.Checked[i]=true then
RxCheckListBox1.Items.Delete(i);
end;
end
else
except
...
end;
end;


Вылетает ошибка:
---------------------------
Debugger Exception Notification
---------------------------
Project Dere.exe raised exception class EStringListError with message "List index out of bounds (3)". Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------


Ross   (2002-04-27 19:41:00) [1]

Точно. Спасибо Шурко и Ally. Не подумал. Но теперь буду знать точно.
Еще раз спасибо.


Ally   (2002-04-27 19:33:00) [2]

Возможно все дело в том, что в теле цикла у Вас удаляются итемы, изначальное число которых было задано при входе посредством
> RxCheckListBox1.Items.Count-1
, которое, разумеется, изменяется при удалении, но кол-во заданныхциклов остается прежним и iнарастает в соответствии с ним - здесь возникает ситуация, когда вы пытаетесь удалить, скажем, i-й итем, а у вас их уже i-2 из-за Delet"а в теле цикла.
Надеюсь, что не очень путано объяснил ситуацию :)

Удачи.


Шурко   (2002-04-27 19:32:00) [3]

Твоя ошибка в цикле
for i:=0 to RxCheckListBox1.Items.Count-1 do
:)))
перебор I например от 0 до 9 , а если 5 елемент удалить ????

надо писать:
for i:=RxCheckListBox1.Items.Count-1 downto 0 do

или :
I:=0;
while I<RxCheckListBox1.Items.Count do
if ... then RxCheckListBox1.Items.delete(I)
else inc(I);

Удачи и поменьше таких ляпов :)))).


Наверх

Титульная страница Поиск, карта сайта Написать письмо