| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Уничтожить кнопку |
| Автор: Proxin 16.12.2009, 16:12 |
| Нужно удалить (free) кнопку по нажатию на неё саму. Пытался через postmessage - не помогает - вылезает av. Рылся в дркб - не нашёл. Можете подсказать, как это сделать? |
| Автор: Teleport 16.12.2009, 16:28 | ||
|
| Автор: Proxin 16.12.2009, 16:49 |
| Что-то не то. Выскакивает ошибка в драйвере msctf.dll. |
| Автор: Демо 16.12.2009, 17:14 |
| Пользуйся поиском. http://forum.vingrad.ru/topic-281127.html |
| Автор: DarkProg 16.12.2009, 17:18 | ||||
Я не знаю зачем присваивать nil, но знаю что Button1.Free; - 100% работает А если у тебя ТО у тебя Делфик криво стал Кстати этот метод работает не только для кнопок но и для всех компонентов |
| Автор: Демо 16.12.2009, 17:27 | ||
Этот способ никогда не будет работать из метода объекта. |
| Автор: bems 16.12.2009, 17:38 |
| Не никогда. Но если работает - просто повезло (или не повезло, лучше бы баг было видно сразу) |
| Автор: Teleport 16.12.2009, 18:03 | ||
Прикладываю exe 1) Сначала нажмите Button2 - увидете список имен всех контролов TButton на форме (Button1, Button2). 2) Потом нажмите Button1 - уничтожите Button1. 3) Теперь нажмите снова Button2 - в списке имен всех контролов TButton на форме - отсутствует Button1 По-моему все верно. |
| Автор: Proxin 16.12.2009, 18:48 |
| Спасибо. Это я затупил чего-то. Написал постро через постмессаг. |
| Автор: bems 16.12.2009, 20:09 |
| Teleport, выше же ясно сказано, что фигня это. Обработчик события вызывается из метода объекта. После обработчика объект уже разрушен, а метод вызвавший обработчик всё еще выполняется. Тут возможно три сценария. 1) Вызывающий метод после выхода из обработчика не использует поля объекта и не вызывает другие методы. или вызывает, но эти методы в свою очередь не используют поля объекта. Хороший вариант, но такое поведение не гарантируется, и если всё работает нормально для TButton.OnClick, то это совсем не обязательно будет так с другими классами и/или событиями. И может измениться в следующих версиях VCL 2) Метод использует поля объекта и память, выделенная под объект еще не занята другими данными и не возвращена системе. В этом случае оно работает до тех пор, пока не меняется ситуация с выделением. Например если сразу после вызова Free какой-нить код запросит память, то вполне возможно что ему достанется область, содержащая удаленный объект. Получим случай 3 3) Метод обращается к полям, при этом а) Память возвращена системе - получим AccessViolation б) Память предоставлена под другие нужды программы - либо читаем мусор, либо портим другие данные. В обоих случаях сразу ошибки не видно, но поведение программы становится непредсказуемым |
| Автор: Teleport 16.12.2009, 21:45 |
| 2 bems - замечание понятно. Вывод - уничтожить можно только не из метода данного объекта? |
| Автор: bems 16.12.2009, 22:58 |
| Да. Не даром же у TForm предусмотрели метод Release |
| Автор: vgGrey 16.12.2009, 23:17 | ||
Proxin, попробуй вот так:
Вроде работает... |
| Автор: bems 16.12.2009, 23:21 |
| Замена OnClick на OnMouseUp что-то кардинально меняет? |
| Автор: vgGrey 16.12.2009, 23:34 |
| Button1 = nil Это вам о чем-то говорит? Вот обращаться к Button1 уже нехорошо. Хотя, вы скорее всего правы... |
| Автор: bems 17.12.2009, 02:01 |
с чего бы? |
| Автор: vgGrey 17.12.2009, 11:14 | ||
Жмите F7 и наведите курсор на Button1 и увидите... Добавлено через 5 минут и 58 секунд Proxin, а зачем удалять то? Ведь можно применить Visible, Hide... |
| Автор: bems 17.12.2009, 19:43 |
| Я не думаю что у поля формы Button1 есть шанс тать равным nil в результате работы твоего кода. Но я проверю, когда окажусь за компьютером с установленой средой. А сейчас предположим что это верно. Также предположим что все вложеные вызовы методов (уже уничтоженного) объекта каким-то образом изменили свой Self в стеке на nil. Тогда при обращении к полю объекта будет обращение к адресу 0 + смещение от начала объекта до поля. То есть запись или чтение в адрес 00000004, 00000008 и тому подобные маленькие числа. Это AV |