NewList: баг или неверное использование?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

NewList: баг или неверное использование?

Сообщение Romtek » 25.08.2009 15:54:34

Пишу программу, используя средства библиотеки FreeVision на fpc 2.2.2 под linux.

Натолкнулся на непонятную для меня вещь: если заполненять список элементов вызове метода NewList объекта, унаследованного от TListBox, а потом удалить любой существующий элемент из коллекции с которой ассоциирован объект, то программа аварийно завершается с ошибкой 213 (несуществующий элемент в коллекции).
Если не выполнять метод NewList для ассоциации коллекции к объекту, а просто удалить элемент из коллекции, то программа работает исправно.

Подскажите в чём дело, а то уже убил впустую три дня на поиск ошибки.

В прилагаемом файле testv.pas тестовая программа работает с директивой DEBUG. Если её закомментировать, то программа завершается аварийно при попытке удаления элемента (удаление комбинацией Alt-D).
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Romtek
постоялец
 
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган

Re: NewList: баг или неверное использование?

Сообщение Mr.Smart » 25.08.2009 19:39:14

Выложите проект вместе с включаемыми файлами (*.inc) и доп. модулями. Либо оставте только код вызывающий ошибку!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: NewList: баг или неверное использование?

Сообщение Romtek » 26.08.2009 00:38:45

Прошу прощения, не проверил перед отправкой.
Вот рабочий вариант.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Romtek
постоялец
 
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган

Re: NewList: баг или неверное использование?

Сообщение Mr.Smart » 26.08.2009 10:53:26

Romtek
Что можно сказать. Созданная вами коллекция принадлежит уже непосретственно PListBox и все операции удаления/добавления записей необходимо делать методами именно PListBox, а не коллекции.
Ситуация следующая вы удаляеье элемент из коллекции, а в объекте списка в поле осталось старое значение количества элементов и при перерисовки происходит соответственно эксцепшен.
Выход пользоваться методами добавления/удаления непосредственно TListBox (DeleteFocusedItem, DeleteItem, Insert) или после каждой операции изменения коллекции выполнять метод SetRange:
Код: Выделить всё
...
  if AgentsRegistered^.Count>0 then
//    AgentsRegistered^.AtDelete (0);   //      <-- DEBUG !!
      if AgentsRegistered^.DeleteByName (Agent) then
      MessageBox(
        Format(Msg_AgentDeleted, Agent),
        nil, mfInformation + mfOkButton);

  PListBox(AgentsLB)^.SetRange(AgentsRegistered^.Count);
...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru