| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Самоуничтожение визуального компонента |
| Автор: PosiTive 29.3.2009, 13:44 | ||||
| Ситуация: динамически создаются кнопки
и обработчик onclick
при нажатии на кнопку она удаляется, но вместе с этим выдается ошибка обращения к памяти. Как я понимаю нельзя удалять объект из собственного же метода. Может быть есть какой-нибудь ещё способ? Заранее спасибо. |
| Автор: Akella 29.3.2009, 15:00 |
| FreeAndNil? |
| Автор: PosiTive 29.3.2009, 15:03 | ||
всмысле (Sender as TButton).Free? если да, то пробовал, тоже самое :( |
| Автор: Akella 29.3.2009, 15:06 | ||
| PosiTive, нет Добавлено через 56 секунд Что в справке написано по FreeAndNil? Добавлено через 4 минуты и 40 секунд Ладно, если не можешь додумать, то вот:
|
| Автор: PosiTive 29.3.2009, 15:14 | ||||||
таже самая ошибка памяти. на всякий случай кусок кода:
|
| Автор: Akella 29.3.2009, 15:18 |
ты видишь мой кусок кода или нет?? ГДЕ ТАМ SENDER? |
| Автор: kami 29.3.2009, 15:19 |
Правильно, нельзя. После вызова события OnClick в процедуре TWinControl.DoKeyPress еще идет обращение к полям экземпляра класса, хотя самого экземпляра уже не существует. Отсюда AV. Нужно реализовать "замедленное" удаление, например - через механизм сообщений Windows. |
| Автор: kami 29.3.2009, 15:26 | ||
| Поясняю. Мы - в обработчике события OnClick той кнопки, которую нужно уничтожить. Само собой, что уничтожить ее напрямую нет возможности (а соблазн так велик Тогда делаем следующий финт ушами:
Какой Owner, какой Sender? У человека создается КУЧА кнопок динамически. Переменная job_button_delete теряет смысл сразу после выхода из процедуры создания, да и можно вполне обойтись и без нее. |
| Автор: PosiTive 29.3.2009, 15:37 | ||||
Большое спасибо за совет. У вас кошелек на Яндекс.Деньгах есть? |
| Автор: Akella 29.3.2009, 16:45 | ||
ну owner ведь должен быть у кнопки |
| Автор: Akella 29.3.2009, 17:45 | ||
|
| Автор: THandle 29.3.2009, 19:56 |
Ну дык а это кто: Хотя можно указать и Nil, если сам убивать собираешься. Вообще kami все правильно говорит. Этот метод кстати описан в книге http://forum.vingrad.ru/books/topic-198003.html. |
| Автор: БелАмор 23.8.2010, 02:30 |
Нельзя уничтожать объект не "из собственного метода", а "из собственного обработчика". Это две большие разницы. "Собственный метод" - это метод, объявленный в этом классе, а "собственный обработчик" - это любой (подходящий) метод любого класса (объекта которого может даже не существовать), ссылка на который хранится в свойстве OnЧтоТоТам своего объекта. Причём в большинстве случаев обработчик является не своим методом, например: TForm1.Button1Click - это обработсик OnClick кнопки Button1, но является методом формы Form1. Ещё пример "большой разницы": Form2.Free; Здесь Free - "свой метод", и в нём вызывается деструктор, но он не "свой обработчик"... |