Показать сообщение отдельно
  #8  
Старый 02.05.2018, 07:47
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Ошибка была не очевидная, но таки понятная Связана она с самоуничтожением объекта.
Когда Вы нажимаете на динамически созданную кнопку, срабатывает метод ListButtonClick, который в свою очередь вызывает ShowList. Ну а в ShowList Вы удаляете все ранее созданные динамические объекты и создаете их по новой. По завершению метода ShowList программа возвращается в ListButtonClick и когда завершается он, то происходит внутреннее обращение к вызвавшему этот метод объекту. А он уже уничтожен. Вот Вам и ошибка доступа к памяти.

Почему она происходила не всегда? Да потому, что под массив Form2.Components[] память выделена и только перераспределяется по необходимости при добавлении или удалении элементов, а адресация при этом сохраняется. Если Вы удаляете элемент из середины списка, то ошибки не будет, т.к. весь массив элементов сдвигается на место удаленных и ссылка на объект не NULL. А когда удаляете последний, то его место уже никто не занимает и ссылка - NULL. Привет ошибка доступа к памяти.

Код для удаления объектом самого себя можно найти в интернете. Вариантов для этого уйма. Удачи!
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием