|
Модераторы: Snowy, MetalFan, bems, Poseidon |
|
PosiTive |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 77 Регистрация: 11.12.2006 Репутация: нет Всего: нет |
Ситуация:
динамически создаются кнопки
и обработчик onclick
при нажатии на кнопку она удаляется, но вместе с этим выдается ошибка обращения к памяти. Как я понимаю нельзя удалять объект из собственного же метода. Может быть есть какой-нибудь ещё способ? Заранее спасибо. Это сообщение отредактировал(а) bems - 28.12.2009, 23:51 |
||||
|
|||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
FreeAndNil?
|
|||
|
||||
PosiTive |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 77 Регистрация: 11.12.2006 Репутация: нет Всего: нет |
всмысле (Sender as TButton).Free? если да, то пробовал, тоже самое :( |
|||
|
||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
||||
|
||||
PosiTive |
|
||||||
Шустрый Профиль Группа: Участник Сообщений: 77 Регистрация: 11.12.2006 Репутация: нет Всего: нет |
таже самая ошибка памяти. на всякий случай кусок кода:
|
||||||
|
|||||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
||||
|
||||
kami |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Правильно, нельзя. После вызова события OnClick в процедуре TWinControl.DoKeyPress еще идет обращение к полям экземпляра класса, хотя самого экземпляра уже не существует. Отсюда AV. Нужно реализовать "замедленное" удаление, например - через механизм сообщений Windows. |
|||
|
||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
а где owner? |
|||
|
||||
kami |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Поясняю.
Мы - в обработчике события OnClick той кнопки, которую нужно уничтожить. Само собой, что уничтожить ее напрямую нет возможности (а соблазн так велик ). Тогда делаем следующий финт ушами:
Какой Owner, какой Sender? У человека создается КУЧА кнопок динамически. Переменная job_button_delete теряет смысл сразу после выхода из процедуры создания, да и можно вполне обойтись и без нее. Это сообщение отредактировал(а) kami - 29.3.2009, 15:32 |
|||
|
||||
PosiTive |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 77 Регистрация: 11.12.2006 Репутация: нет Всего: нет |
Большое спасибо за совет. У вас кошелек на Яндекс.Деньгах есть? |
||||
|
|||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
||||
|
||||
Akella |
|
|||
Творец Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
||||
|
||||
THandle |
|
|||
Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Ну дык а это кто: Хотя можно указать и Nil, если сам убивать собираешься. Вообще kami все правильно говорит. Этот метод кстати описан в книге Антона Григорьева. |
|||
|
||||
БелАмор |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 7 Всего: 17 |
Нельзя уничтожать объект не "из собственного метода", а "из собственного обработчика". Это две большие разницы. "Собственный метод" - это метод, объявленный в этом классе, а "собственный обработчик" - это любой (подходящий) метод любого класса (объекта которого может даже не существовать), ссылка на который хранится в свойстве OnЧтоТоТам своего объекта. Причём в большинстве случаев обработчик является не своим методом, например: TForm1.Button1Click - это обработсик OnClick кнопки Button1, но является методом формы Form1. Ещё пример "большой разницы": Form2.Free; Здесь Free - "свой метод", и в нём вызывается деструктор, но он не "свой обработчик"... |
|||
|
||||
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |