Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Destroy себя - ошибка!

Ответить
Настройки темы
Delphi - Destroy себя - ошибка!

Новый участник


Сообщения: 3
Благодарности: 1

Профиль | Отправить PM | Цитировать


Доброго времени,
Проблема заключается в следующем, пишу для себя компонент, Родителем является TsScrollBox, а дочерними TsPanel (со свойствами alTop).



Дочерние элементы создаю динамически, и присваиваются через "добавленную" к родителю функцию Add.

Ошибка заключается в следующем, в каждой строке имеется кнопка "Х" закрыть (удалить строку), При нажатии на нее вызывается встроенное событие doCloseClick, в котором выполняется Free;и переход в destructor:
Код: Выделить весь код
 DestroyComponents;
 FFileStream.Free;
 inherited Destroy;
после этого осуществляется возврат к концу doCloseClick и "ОШИБКА" доступа к памяти по адресу 0х00000030.

Заметил что если удалить создание дочерних элементов, т.е. оставить только одну кнопку закрыть, то ошибки нету.

Отправлено: 16:52, 28-02-2010

 

ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Цитата e5620:
после этого осуществляется возврат к концу doCloseClick и "ОШИБКА" доступа к памяти по адресу 0х00000030. »
Всё правильно.
Объёкт уже удалён, соответственно доступ к его полям класса и виртуальным функциям будет вызывать ошибку.
А доступ этот, разумеется, производится где-то в нижних уровнях иерархии классов. Если интересно, где именно - установи "исходники VCL" и поищи
Вообще "самоуничтожение" объектов недопустимо просто потому,*что после вызова деструктора метод объекта будет продолжаться

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 06:26, 01-03-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


что такое FFileStream? как и когда объявлен? поставь перед каждым ...Free код if (...<>0) debug_string('уже удалён'); а после каждого ...=0. В какой последовательности в делфи идёт уничтожение объектов?
к примеру: в с++ сначала вызывается деструктор объекта, потом только всех его составляющих (таким образом на момент видимости они ещё живы)

Отправлено: 07:44, 01-03-2010 | #3


ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


pva, видишь ли, у него получается так - вызывается деструктор объекта, объект уничтожается, текущий метод завершается, потом управление передаётся в другие методы уже уничтоженного объекта.

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 05:43, 02-03-2010 | #4

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


а если строчки местами поменять - заработает?

Отправлено: 07:25, 02-03-2010 | #5


ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


pva, разумеется нет - ведь ошибка происходит в базовых классах при обращении к полям уже удалённого объекта

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 05:04, 03-03-2010 | #6

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата e5620:
Ошибка заключается в следующем, в каждой строке имеется кнопка "Х" закрыть (удалить строку), При нажатии на нее вызывается встроенное событие doCloseClick, в котором выполняется Free;и переход в destructor:
Код:
DestroyComponents;
FFileStream.Free;
inherited Destroy; »
это код деструктора? а doCloseClick можно посмотреть?

Отправлено: 19:42, 03-03-2010 | #7


ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Цитата e5620:
Ошибка заключается в следующем, в каждой строке имеется кнопка "Х" закрыть (удалить строку), При нажатии на нее вызывается встроенное событие doCloseClick, в котором выполняется Free;и переход в destructor »
А*после завершения деструктора происходит возвращение в метод doCloseClick удалённого компонента,*из него - в метод doClick удалённой кнопки "Закрыть"
Не надо так делать. Согласно принципам ООП, правильнее будет следующий способ.
Метод doCloseClick скрывает компонент, выставляет значение true логическому свойству "DeleteMe" компонента и завершает работу.
Далее вызывается обработчик для события OnIdle (вызывается в моменты "простоя программы"), который перебирает компоненты и удаляет отмеченные.
Или можно поступить проще - не удалять закрываемые компоненты, а лишь скрывать их, обнулять свойства и перемещать в конец списка. Ведь всё равно так или иначе потребуется добавлять новые - тогда по команде "Добавить" программа просто отобразит первый из скрытых, а новый компонент создавать будет только при необходимости

P.S.
Цитата e5620:
Заметил что если удалить создание дочерних элементов, т.е. оставить только одну кнопку закрыть, то ошибки нету. »
Возможно, потому что удаление дочерних элементов (адреса которых перечисляются в списке Components) производится автоматически в деструкторе класса TComponents

Кстати, не мешало бы почитать справку по методу TComponents.DestroyComponents().
Что он делает? Как он работает? Нужно ли вызывать его вручную? Какие проблемы могут возникнуть при его вызове?

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 05:04, 04-03-2010 | #8

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


в делфи это самое делает TForm.Release. e5620, интерес к теме не пропал ещё?

Отправлено: 07:51, 05-03-2010 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Destroy себя - ошибка!

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Безопасность - [addon] Spybot Search&Destroy 1.6.0 + сигнатуры YikxX Наборы обновлений для Windows XP/2003/Windows 7 35 24-07-2010 11:34
Spybot - Search & Destroy Bysh Автоматическая установка приложений 5 14-08-2008 13:20
Безопасность - Установка Spybot-Seach & Destroy 1.5.1.17? GifuN Защита компьютерных систем 1 17-10-2007 13:40
98 не видит себя wolland Сетевые технологии 2 17-11-2005 22:27
Замыкание на себя. Deil Сетевые технологии 4 12-04-2004 11:37




 
Переход