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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2008, 20:20   #1
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию TCheckListBox

Пытаюсь удалить все выделенные элементы из TCheckListBox

Код:
with checklistbox1 do
for i:=0 to count-1 do
if state[i]=cbChecked then Items.Delete(i);
Ошибка ...'List index out of bounds(2)'...

Посмотрите, пожалуйста, че не так.
Xardas вне форума Ответить с цитированием
Старый 20.01.2008, 20:32   #2
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

ГЫ, индексация у этого компонента идет с 1, т.е.
Код:
with checklistbox1 do   
for i:=1 to count do   
if state[i]=cbChecked then Items.Delete(i);
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 20.01.2008, 20:42   #3
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Цитата:
Сообщение от SunKnight Посмотреть сообщение
ГЫ, индексация у этого компонента идет с 1, т.е.
Код:
with checklistbox1 do   
for i:=1 to count do   
if state[i]=cbChecked then Items.Delete(i);
Индексация начинается с нуля:
http://program.rin.ru/razdel/html/1146.html
Xardas вне форума Ответить с цитированием
Старый 20.01.2008, 20:53   #4
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Извените, что то не то в попыхах наплел.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 20.01.2008, 20:54   #5
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

И при сохранении в файл выдает эту же ошибку

Код:
procedure TFrameRuleEngineSaveRules;
var
  i: Integer;
begin
  i := 0;
  while i < checklistbox1.Items.Count do
  begin
    if CheckListBox1.Items[i] = '' then
    begin
     СheckListBox1.Items.Delete(i);
    end
    else
    begin
      CheckListBox1.Items[i] :=
      IntToStr(Integer(CheckListBox1.Checked[i])) +
      CheckListBox1.Items[i];
      Inc(i);
    end;
  end;
  CheckListBox1.Items.SaveToFile(ExtractFilePath(Application.ExeName) +
  'Rule.Txt');
Xardas вне форума Ответить с цитированием
Старый 20.01.2008, 21:21   #6
darkstarx
Пользователь
 
Регистрация: 20.01.2008
Сообщений: 24
Восклицание

Да бросьте вы, что за проблемы. Посмотрите повнимательнее до куда у вас цикл-то идет (List.Count-1):

Исходный список:
(0-checked) (1-nonchecked) (2-nonchecked) (3-checked) (4-nonchecked)

А теперь как работает ваш алгоритм:
Итерация 1: i=0 -> пропуск
Итерация 2: i=1 -> удаление, результат:
(0-checked) (1-nonchecked) (2-checked) (3-nonchecked)
Итерация 3: i=2 -> пропуск
Итерация 4: i=3 -> удаление, результат:
(0-checked) (1-nonchecked) (2-checked)
Итерация 5: i=4 -> Acseption Error: List index out of bounds(4)

потому что массив имеет длину уже не 5, а 3!!!
darkstarx вне форума Ответить с цитированием
Старый 20.01.2008, 21:40   #7
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Цитата:
Сообщение от darkstarx Посмотреть сообщение
Да бросьте вы, что за проблемы. Посмотрите повнимательнее до куда у вас цикл-то идет (List.Count-1):

Исходный список:
(0-checked) (1-nonchecked) (2-nonchecked) (3-checked) (4-nonchecked)

А теперь как работает ваш алгоритм:
Итерация 1: i=0 -> пропуск
Итерация 2: i=1 -> удаление, результат:
(0-checked) (1-nonchecked) (2-checked) (3-nonchecked)
Итерация 3: i=2 -> пропуск
Итерация 4: i=3 -> удаление, результат:
(0-checked) (1-nonchecked) (2-checked)
Итерация 5: i=4 -> Acseption Error: List index out of bounds(4)

потому что массив имеет длину уже не 5, а 3!!!
Допустим в списке 3 элемента. Ставлю цикл от 0 до 2, эта же ошибка.

И че то я не понял, что Вы хотели сказать. Я бросил TLabel на форму и выставил Label1.caption:=inttostr(CheckListB ox1.items.count) и при удалении в заголовок метки ставится то число, сколько элементов в списке.
Xardas вне форума Ответить с цитированием
Старый 20.01.2008, 21:58   #8
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Записал вот так:

with checklistbox1 do
for i:=items.Count-1 downto 0 do
if state[i]=cbChecked then Items.Delete(i);

и все заработало, только я никак не могу понять почему когда было так:

with checklistbox1 do
for i:=0 to items.Count-1 do
if state[i]=cbChecked then Items.Delete(i);

не работало???????????
Xardas вне форума Ответить с цитированием
Старый 20.01.2008, 21:59   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Проблема решается очень просто.
Не нужно никаких псевдонаучных изысканий и флуда.
Что бы вы ни удаляли, удаляйте с помощью обратного цикла, то есть в вашем случае:
Код:
with checklistbox1 do   
for i:=count-1 downto 0 do   
if state[i]=cbChecked then Items.Delete(i);
В этом случае вы никогда не получите вашу ошибку...
mihali4 вне форума Ответить с цитированием
Старый 26.01.2008, 23:30   #10
darkstarx
Пользователь
 
Регистрация: 20.01.2008
Сообщений: 24
По умолчанию

Вы меня совсем не поняли!!!
Когда речь идет о списке, из которого нужно удалить записи, то цикл for to неприемлем, так как такая конструкция в паскале предполагает константы (for const1 to const2 begin end В Вашем случае предпочтительнее использовать конструкцию while i < Count do begin ... end; или, как посоветовали, обратный цикл.

Странно, что Вас мой пример в сообщении не убедил...посмотрите повнимательнее.
Приведу пример еще раз, уже обоих случаев:
Пусть нужно удалить только те элементы массива, в которых стоит '+'
Случай 1 (for 0 to Count-1):

i 0 1 2 3 4
0 + - + + +
1 - + + +
2 - + +
3 - + (error)
4 -

Случай 2 (for Count-1 downto 0):

i 0 1 2 3 4
4 + - + + +
3 + - + +
2 + - +
1 + -
0 + -
ошибок нет и быть не может, так как нет обращений к элементам, отсутствующим в списке (при удалении сдвиг происходит влево, пожтому читать нужно справа налево, чтобы ваш счетчик сдвигался в ту же сторону)
darkstarx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TCheckListBox Snoopy Компоненты Delphi 2 22.08.2008 10:38
TCheckListBox andrey4623 Общие вопросы Delphi 6 29.12.2007 19:44
TCheckListBox Вопрос Рома Компоненты Delphi 12 06.09.2007 16:38
TCheckListBox - не работает mrandrey Компоненты Delphi 0 30.03.2007 11:17