|
#1
|
|||
|
|||
Ошибка
Привет, ребята. Есть такая странная ошибка list index out of bounds, как исправить ее? Имеется программа, вкратце:
Код:
if checklistbox[i].checked or ... then Form2.Memo1.Lines.Add('1111'); Спасибо, жду советов. |
#2
|
||||
|
||||
Это выход из диапазона значений, т.е. идёт обращение к не существующему объекту списка. Решается заданием соответствующих условий циклу, напр.
Код:
... for i := 0 to obj.Count - 1 do ... Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
ну, у меня циклом никак не получится, потому что не для каждого i нужно выполнять действие.
при чем ошибка вылетает не всегда, а после некторого if-then. |
#4
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
|||
|
|||
ок. указываю. проблема-то и в том, что, короче, вот:
Код:
begin if CheckListBox1.checked[2] or CheckListBox1.checked[3] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[2] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Генераторы шумовых сигналов'); if CheckListBox1.checked[2] or CheckListBox1.checked[3] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[2] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Низкочастотные генераторы сигналов'); if CheckListBox1.checked[2] or CheckListBox1.checked[3] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[2] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Усилители мощности'); if CheckListBox1.checked[2] or CheckListBox1.checked[3] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[2] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Акустические излучатели'); if CheckListBox1.checked[2] or CheckListBox1.checked[3] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[2] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Измерители шума и вибраций (шумомеры)'); if CheckListBox1.checked[0] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[2] or CheckListBox3.checked[0] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Селективные микровольтметры, измерительные приемники (анализаторы спектра)'); if CheckListBox1.checked[0] or CheckListBox1.checked[1] or CheckListBox1.checked[2] or CheckListBox1.checked[3] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[3] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Селективные нановольтметры'); if CheckListBox1.checked[2] or CheckListBox1.checked[2] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[2] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Измерительные микрофоны'); if CheckListBox1.checked[0] or CheckListBox1.checked[1] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[0] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Измерительные антенны'); if CheckListBox1.checked[2] or CheckListBox1.checked[3] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[2] then Form2.Memo1.Lines.Add('Вибродатчики (акселерометры)'); if CheckListBox1.checked[0] or CheckListBox1.checked[1] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[0] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Измерительные пробники'); if CheckListBox1.checked[2] or CheckListBox1.checked[3] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[2] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Полосовые октавные фильтры со среднегеометри- ческими частотами 250, 500, 1000, 2000, 4000 Гц'); if CheckListBox1.checked[0] or CheckListBox1.checked[1] or CheckListBox3.checked[0] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] then Form2.Memo1.Lines.Add('Осциллографы'); { if Checklistbox6.Checked[0] or CheckListBox3.checked[0] or CheckListBox4.checked[0] then Form2.Memo1.Lines.Add('Программные средства формирования и контроля полномочий доступа в AC'); } if CheckListBox2.checked[3] or CheckListBox2.checked[4]or CheckListBox2.checked[5] or CheckListBox3.checked[0] or CheckListBox4.checked[0] then Form2.Memo1.Lines.Add('Программные средства контроля целостности программ и программных комплексов'); вот до выделенного места все работает, а потом при добавлении еще одного условия, не хочет. Извините, за громоздкий код. для наглядности |
#6
|
|||
|
|||
может есть ограничение, типа не больше 10 if на одну битбатон?))
|
#7
|
||||
|
||||
Сейчас попробую оптимизировать
Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 11.05.2014 в 17:07. |
#8
|
|||
|
|||
Я знаю, что есть повторы, но, поверьте, того требует законодательство в сфере лицензирования, изменить ничего не могу. надо запрограммировать так, как изложено. но не может же быть в этом проблемы.
|
#9
|
|||
|
|||
хотя, наверное, позже исправлю. но надо разобраться с этой ошибкой. откуда она...
|
#10
|
||||
|
||||
Цитата:
Сколько элементов содержит каждый из CheckListBox-ов? p.s. Исходя из исходника CheckListBox2 должен содержат не менее 6 элементов - иначе будет такая ошибка. |
#11
|
|||
|
|||
конечно, чеклистбоксы содержат все то, что есть в коде. проблема в том, что когда выбираем только чеклистбокс 6, то только тогда и выходит эта преславутая ошибка.странно.
|
#12
|
|||
|
|||
freya_pc, будьте пожалуйста внимательнее! Я уже запостил решение:
http://www.delphisources.ru/forum/sh...ad.php?t=26139 Нет, Вы все равно упорно проверяете в цикле на checked!.. |
Этот пользователь сказал Спасибо Тролль за это полезное сообщение: | ||
freya_pc (11.05.2014)
|
#13
|
|||
|
|||
да, все не так уж и просто.
|
#14
|
|||
|
|||
Если что-то не понятно, пишите в личку, попытаюсь объяснить(я имею в виду свой код). В вашем не разобрался.
Цитата: Код:
begin if CheckListBox1.checked[2] or CheckListBox1.checked[3] or CheckListBox2.checked[0] or CheckListBox2.checked[1] or CheckListBox2.checked[2] or CheckListBox3.checked[1] or CheckListBox3.checked[2] or CheckListBox5.checked[0] or CheckListBox5.checked[1] or CheckListBox5.checked[2] Один сплошной "анакондовый" OR; хотя так и тянет поставить AND. Обычно каждое условие оборачивают в скобки: Код:
(CheckListBox2.checked[0]) or (CheckListBox2.checked[1]) or (CheckListBox2.checked[2]) Последний раз редактировалось Тролль, 11.05.2014 в 20:41. |
#15
|
||||
|
||||
Всё, впал в ступор, поскольку оптимизация дошла до совпадающих условий
Код:
if (CheckListBox5.checked[0]) or (CheckListBox5.checked[1]) or (CheckListBox5.checked[2]) or (CheckListBox2.checked[0]) or (CheckListBox2.checked[1]) or (CheckListBox2.checked[2]) then begin if CheckListBox1.checked[0] then begin if {1 1} CheckListBox1.checked[1] or {3 0} CheckListBox3.checked[0] then Form2.Memo1.Lines.Add('Осциллографы'); if {1 1} CheckListBox1.checked[1] or {1 2} CheckListBox1.checked[2] or {1 3} CheckListBox1.checked[3] or {3 1} CheckListBox3.checked[1] or {3 3} CheckListBox3.checked[3] then Form2.Memo1.Lines.Add('Селективные нановольтметры'); if {1 1} CheckListBox1.checked[1] or {3 0} CheckListBox3.checked[0] then Form2.Memo1.Lines.Add('Измерительные антенны'); if {1 1} CheckListBox1.checked[1] or {3 0} CheckListBox3.checked[0] then Form2.Memo1.Lines.Add('Измерительные пробники'); if {3 0} CheckListBox3.checked[0] or {3 1} CheckListBox3.checked[1] or {3 2} CheckListBox3.checked[2] then Form2.Memo1.Lines.Add('Селективные микровольтметры, измерительные приемники (анализаторы спектра)'); end; if (CheckListBox3.checked[1]) or (CheckListBox3.checked[2]) then begin if {1 2} CheckListBox1.checked[2] or {1 3} CheckListBox1.checked[3] then Form2.Memo1.Lines.Add('Генераторы шумовых сигналов'); if {1 2} CheckListBox1.checked[2] or {1 3} CheckListBox1.checked[3] then Form2.Memo1.Lines.Add('Низкочастотные генераторы сигналов'); if {1 2} CheckListBox1.checked[2] or {1 3} CheckListBox1.checked[3] then Form2.Memo1.Lines.Add('Усилители мощности'); if {1 2} CheckListBox1.checked[2] or {1 3} CheckListBox1.checked[3] then Form2.Memo1.Lines.Add('Акустические излучатели'); if {1 2} CheckListBox1.checked[2] then Form2.Memo1.Lines.Add('Измерительные микрофоны'); if {1 2} CheckListBox1.checked[2] or {1 3} CheckListBox1.checked[3] then Form2.Memo1.Lines.Add('Измерители шума и вибраций (шумомеры)'); if {1 2} CheckListBox1.checked[2] or {1 3} CheckListBox1.checked[3] then Form2.Memo1.Lines.Add('Полосовые октавные фильтры со среднегеометри- ческими частотами 250, 500, 1000, 2000, 4000 Гц'); end; end; if {1 2} CheckListBox1.checked[2] or {1 3} CheckListBox1.checked[3] or {2 0} CheckListBox2.checked[0] or {2 1} CheckListBox2.checked[1] or {2 2} CheckListBox2.checked[2] or {3 1} CheckListBox3.checked[1] or {3 2} CheckListBox3.checked[2] then Form2.Memo1.Lines.Add('Вибродатчики (акселерометры)'); if Checklistbox6.Checked[0] or CheckListBox3.checked[0] or CheckListBox4.checked[0] then Form2.Memo1.Lines.Add('Программные средства формирования и контроля полномочий доступа в AC'); if CheckListBox2.checked[3] or CheckListBox2.checked[4] or CheckListBox2.checked[5] or CheckListBox3.checked[0] or CheckListBox4.checked[0] then Form2.Memo1.Lines.Add('Программные средства контроля целостности программ и программных комплексов'); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |