![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Proxin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
Нужно удалить (free) кнопку по нажатию на неё саму. Пытался через postmessage - не помогает - вылезает av. Рылся в дркб - не нашёл. Можете подсказать, как это сделать?
|
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
Это сообщение отредактировал(а) Teleport - 16.12.2009, 16:31 |
|||
|
||||
| Proxin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
Что-то не то. Выскакивает ошибка в драйвере msctf.dll.
|
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
-------------------- |
|||
|
||||
| DarkProg |
|
||||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 4 Всего: 19 |
Я не знаю зачем присваивать nil, но знаю что Button1.Free; - 100% работает А если у тебя ТО у тебя Делфик криво стал Кстати этот метод работает не только для кнопок но и для всех компонентов -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." |
||||
|
|||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Этот способ никогда не будет работать из метода объекта. -------------------- |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Не никогда. Но если работает - просто повезло (или не повезло, лучше бы баг было видно сразу)
-------------------- Обижено школьников: 8 |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
Прикладываю exe 1) Сначала нажмите Button2 - увидете список имен всех контролов TButton на форме (Button1, Button2). 2) Потом нажмите Button1 - уничтожите Button1. 3) Теперь нажмите снова Button2 - в списке имен всех контролов TButton на форме - отсутствует Button1 По-моему все верно. Это сообщение отредактировал(а) Teleport - 16.12.2009, 18:07 Присоединённый файл ( Кол-во скачиваний: 3 )
Project1.rar 173,61 Kb |
|||
|
||||
| Proxin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
Спасибо. Это я затупил чего-то.
Написал постро через постмессаг. Это сообщение отредактировал(а) Proxin - 16.12.2009, 18:49 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Teleport, выше же ясно сказано, что фигня это. Обработчик события вызывается из метода объекта. После обработчика объект уже разрушен, а метод вызвавший обработчик всё еще выполняется. Тут возможно три сценария.
1) Вызывающий метод после выхода из обработчика не использует поля объекта и не вызывает другие методы. или вызывает, но эти методы в свою очередь не используют поля объекта. Хороший вариант, но такое поведение не гарантируется, и если всё работает нормально для TButton.OnClick, то это совсем не обязательно будет так с другими классами и/или событиями. И может измениться в следующих версиях VCL 2) Метод использует поля объекта и память, выделенная под объект еще не занята другими данными и не возвращена системе. В этом случае оно работает до тех пор, пока не меняется ситуация с выделением. Например если сразу после вызова Free какой-нить код запросит память, то вполне возможно что ему достанется область, содержащая удаленный объект. Получим случай 3 3) Метод обращается к полям, при этом а) Память возвращена системе - получим AccessViolation б) Память предоставлена под другие нужды программы - либо читаем мусор, либо портим другие данные. В обоих случаях сразу ошибки не видно, но поведение программы становится непредсказуемым Это сообщение отредактировал(а) bems - 16.12.2009, 20:11 -------------------- Обижено школьников: 8 |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
2 bems - замечание понятно. Вывод - уничтожить можно только не из метода данного объекта?
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Да. Не даром же у TForm предусмотрели метод Release
-------------------- Обижено школьников: 8 |
|||
|
||||
| vgGrey |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.11.2009 Репутация: нет Всего: нет |
Proxin, попробуй вот так:
Вроде работает... |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Замена OnClick на OnMouseUp что-то кардинально меняет?
-------------------- Обижено школьников: 8 |
|||
|
||||
| vgGrey |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.11.2009 Репутация: нет Всего: нет |
Button1 = nil
Это вам о чем-то говорит? Вот обращаться к Button1 уже нехорошо. Хотя, вы скорее всего правы... Это сообщение отредактировал(а) vgGrey - 16.12.2009, 23:38 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
| vgGrey |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.11.2009 Репутация: нет Всего: нет |
Жмите F7 и наведите курсор на Button1 и увидите... Добавлено через 5 минут и 58 секунд Proxin, а зачем удалять то? Ведь можно применить Visible, Hide... Это сообщение отредактировал(а) vgGrey - 17.12.2009, 11:14 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Я не думаю что у поля формы Button1 есть шанс тать равным nil в результате работы твоего кода. Но я проверю, когда окажусь за компьютером с установленой средой. А сейчас предположим что это верно. Также предположим что все вложеные вызовы методов (уже уничтоженного) объекта каким-то образом изменили свой Self в стеке на nil. Тогда при обращении к полю объекта будет обращение к адресу 0 + смещение от начала объекта до поля. То есть запись или чтение в адрес 00000004, 00000008 и тому подобные маленькие числа. Это AV
-------------------- Обижено школьников: 8 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |