![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Destroy себя - ошибка! |
|
Delphi - Destroy себя - ошибка!
|
Новый участник Сообщения: 3 |
Доброго времени,
Проблема заключается в следующем, пишу для себя компонент, Родителем является TsScrollBox, а дочерними TsPanel (со свойствами alTop). ![]() Дочерние элементы создаю динамически, и присваиваются через "добавленную" к родителю функцию Add. Ошибка заключается в следующем, в каждой строке имеется кнопка "Х" закрыть (удалить строку), При нажатии на нее вызывается встроенное событие doCloseClick, в котором выполняется Free;и переход в destructor: после этого осуществляется возврат к концу doCloseClick и "ОШИБКА" доступа к памяти по адресу 0х00000030. Заметил что если удалить создание дочерних элементов, т.е. оставить только одну кнопку закрыть, то ошибки нету. |
|
Отправлено: 16:52, 28-02-2010 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата e5620:
Объёкт уже удалён, соответственно доступ к его полям класса и виртуальным функциям будет вызывать ошибку. А доступ этот, разумеется, производится где-то в нижних уровнях иерархии классов. Если интересно, где именно - установи "исходники VCL" и поищи ![]() Вообще "самоуничтожение" объектов недопустимо просто потому,*что после вызова деструктора метод объекта будет продолжаться |
|
------- Отправлено: 06:26, 01-03-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать что такое FFileStream? как и когда объявлен? поставь перед каждым ...Free код if (...<>0) debug_string('уже удалён'); а после каждого ...=0. В какой последовательности в делфи идёт уничтожение объектов?
к примеру: в с++ сначала вызывается деструктор объекта, потом только всех его составляющих (таким образом на момент видимости они ещё живы) |
Отправлено: 07:44, 01-03-2010 | #3 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать pva, видишь ли, у него получается так - вызывается деструктор объекта, объект уничтожается, текущий метод завершается, потом управление передаётся в другие методы уже уничтоженного объекта.
|
------- Отправлено: 05:43, 02-03-2010 | #4 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать а если строчки местами поменять - заработает?
|
|
Отправлено: 07:25, 02-03-2010 | #5 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать pva, разумеется нет - ведь ошибка происходит в базовых классах при обращении к полям уже удалённого объекта
|
------- Отправлено: 05:04, 03-03-2010 | #6 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата e5620:
|
|
Отправлено: 19:42, 03-03-2010 | #7 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата e5620:
![]() Не надо так делать. Согласно принципам ООП, правильнее будет следующий способ. Метод doCloseClick скрывает компонент, выставляет значение true логическому свойству "DeleteMe" компонента и завершает работу. Далее вызывается обработчик для события OnIdle (вызывается в моменты "простоя программы"), который перебирает компоненты и удаляет отмеченные. Или можно поступить проще - не удалять закрываемые компоненты, а лишь скрывать их, обнулять свойства и перемещать в конец списка. Ведь всё равно так или иначе потребуется добавлять новые - тогда по команде "Добавить" программа просто отобразит первый из скрытых, а новый компонент создавать будет только при необходимости P.S. Цитата e5620:
Кстати, не мешало бы почитать справку по методу TComponents.DestroyComponents(). Что он делает? Как он работает? Нужно ли вызывать его вручную? Какие проблемы могут возникнуть при его вызове? ![]() |
||
------- Отправлено: 05:04, 04-03-2010 | #8 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать в делфи это самое делает TForm.Release. e5620, интерес к теме не пропал ещё?
|
Отправлено: 07:51, 05-03-2010 | #9 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Безопасность - [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 |
|