Пишу программу, используя средства библиотеки FreeVision на fpc 2.2.2 под linux.
Натолкнулся на непонятную для меня вещь: если заполненять список элементов вызове метода NewList объекта, унаследованного от TListBox, а потом удалить любой существующий элемент из коллекции с которой ассоциирован объект, то программа аварийно завершается с ошибкой 213 (несуществующий элемент в коллекции).
Если не выполнять метод NewList для ассоциации коллекции к объекту, а просто удалить элемент из коллекции, то программа работает исправно.
Подскажите в чём дело, а то уже убил впустую три дня на поиск ошибки.
В прилагаемом файле testv.pas тестовая программа работает с директивой DEBUG. Если её закомментировать, то программа завершается аварийно при попытке удаления элемента (удаление комбинацией Alt-D).
NewList: баг или неверное использование?
Модератор: Модераторы
- Romtek
- постоялец
- Сообщения: 190
- Зарегистрирован: 22.05.2005 12:29:35
- Откуда: Рамат Ган
- Контактная информация:
NewList: баг или неверное использование?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Выложите проект вместе с включаемыми файлами (*.inc) и доп. модулями. Либо оставте только код вызывающий ошибку!
Romtek
Что можно сказать. Созданная вами коллекция принадлежит уже непосретственно PListBox и все операции удаления/добавления записей необходимо делать методами именно PListBox, а не коллекции.
Ситуация следующая вы удаляеье элемент из коллекции, а в объекте списка в поле осталось старое значение количества элементов и при перерисовки происходит соответственно эксцепшен.
Выход пользоваться методами добавления/удаления непосредственно TListBox (DeleteFocusedItem, DeleteItem, Insert) или после каждой операции изменения коллекции выполнять метод SetRange:
Что можно сказать. Созданная вами коллекция принадлежит уже непосретственно 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);
...
