Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.05.2014, 16:04
freya_pc freya_pc вне форума
Прохожий
 
Регистрация: 10.05.2014
Сообщения: 14
Версия Delphi: Delphi 7)
Репутация: 10
По умолчанию Ошибка

Привет, ребята. Есть такая странная ошибка list index out of bounds, как исправить ее? Имеется программа, вкратце:
Код:
if checklistbox[i].checked or ... then Form2.Memo1.Lines.Add('1111');
и такиз условий много, порядка 20, но после определенного кол-во ифов, начинает выдавать вот эту ошибку. Может проблема в if, что их слишком много. пока так. код выкладывать не буду, уж очень он однообразный.
Спасибо, жду советов.
Ответить с цитированием
  #2  
Старый 11.05.2014, 16:18
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Это выход из диапазона значений, т.е. идёт обращение к не существующему объекту списка. Решается заданием соответствующих условий циклу, напр.
Код:
...
for i := 0 to obj.Count - 1 do
...
При прокрутке цикла он перерабатывает заложенный диапазон на еденицу, в результате такая ошибка и вылазит
Ответить с цитированием
  #3  
Старый 11.05.2014, 16:37
freya_pc freya_pc вне форума
Прохожий
 
Регистрация: 10.05.2014
Сообщения: 14
Версия Delphi: Delphi 7)
Репутация: 10
По умолчанию

ну, у меня циклом никак не получится, потому что не для каждого i нужно выполнять действие.

при чем ошибка вылетает не всегда, а после некторого if-then.
Ответить с цитированием
  #4  
Старый 11.05.2014, 16:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от freya_pc
ну, у меня циклом никак не получится, потому что не для каждого i нужно выполнять действие.

при чем ошибка вылетает не всегда, а после некторого if-then.
Ну вы как раз итерацию цикла и показали отсюда выводы. А дошло, тогда уж вместо i явно указывайте к какому участнику списка обращаетесь
Ответить с цитированием
  #5  
Старый 11.05.2014, 16:55
freya_pc freya_pc вне форума
Прохожий
 
Регистрация: 10.05.2014
Сообщения: 14
Версия Delphi: Delphi 7)
Репутация: 10
По умолчанию

ок. указываю. проблема-то и в том, что, короче, вот:
Код:
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  
Старый 11.05.2014, 16:59
freya_pc freya_pc вне форума
Прохожий
 
Регистрация: 10.05.2014
Сообщения: 14
Версия Delphi: Delphi 7)
Репутация: 10
По умолчанию

может есть ограничение, типа не больше 10 if на одну битбатон?))
Ответить с цитированием
  #7  
Старый 11.05.2014, 17:04
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Сейчас попробую оптимизировать

Последний раз редактировалось Alegun, 11.05.2014 в 17:07.
Ответить с цитированием
  #8  
Старый 11.05.2014, 17:06
freya_pc freya_pc вне форума
Прохожий
 
Регистрация: 10.05.2014
Сообщения: 14
Версия Delphi: Delphi 7)
Репутация: 10
По умолчанию

Я знаю, что есть повторы, но, поверьте, того требует законодательство в сфере лицензирования, изменить ничего не могу. надо запрограммировать так, как изложено. но не может же быть в этом проблемы.
Ответить с цитированием
  #9  
Старый 11.05.2014, 17:12
freya_pc freya_pc вне форума
Прохожий
 
Регистрация: 10.05.2014
Сообщения: 14
Версия Delphi: Delphi 7)
Репутация: 10
По умолчанию

хотя, наверное, позже исправлю. но надо разобраться с этой ошибкой. откуда она...
Ответить с цитированием
  #10  
Старый 11.05.2014, 18:29
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от freya_pc
может есть ограничение, типа не больше 10 if на одну битбатон?))
Никаких ограничений на количество if не накладывается.
Сколько элементов содержит каждый из CheckListBox-ов?

p.s. Исходя из исходника CheckListBox2 должен содержат не менее 6 элементов - иначе будет такая ошибка.
Ответить с цитированием
  #11  
Старый 11.05.2014, 18:36
freya_pc freya_pc вне форума
Прохожий
 
Регистрация: 10.05.2014
Сообщения: 14
Версия Delphi: Delphi 7)
Репутация: 10
По умолчанию

конечно, чеклистбоксы содержат все то, что есть в коде. проблема в том, что когда выбираем только чеклистбокс 6, то только тогда и выходит эта преславутая ошибка.странно.
Ответить с цитированием
  #12  
Старый 11.05.2014, 18:37
Тролль Тролль вне форума
Заблокирован
 
Регистрация: 07.05.2014
Сообщения: 11
Версия Delphi: 7, Kylix
Репутация: -1385
По умолчанию

freya_pc, будьте пожалуйста внимательнее! Я уже запостил решение:
http://www.delphisources.ru/forum/sh...ad.php?t=26139

Нет, Вы все равно упорно проверяете в цикле на checked!..
Ответить с цитированием
Этот пользователь сказал Спасибо Тролль за это полезное сообщение:
freya_pc (11.05.2014)
  #13  
Старый 11.05.2014, 18:44
freya_pc freya_pc вне форума
Прохожий
 
Регистрация: 10.05.2014
Сообщения: 14
Версия Delphi: Delphi 7)
Репутация: 10
По умолчанию

да, все не так уж и просто.
Ответить с цитированием
  #14  
Старый 11.05.2014, 18:51
Тролль Тролль вне форума
Заблокирован
 
Регистрация: 07.05.2014
Сообщения: 11
Версия Delphi: 7, Kylix
Репутация: -1385
По умолчанию

Если что-то не понятно, пишите в личку, попытаюсь объяснить(я имею в виду свой код). В вашем не разобрался.

Цитата:
Код:
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  
Старый 11.05.2014, 19:37
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Всё, впал в ступор, поскольку оптимизация дошла до совпадающих условий
Код:
 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;
смотрите сами
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter