![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| DmiSbr |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 14.4.2010 Репутация: нет Всего: нет |
Доброго всем дня !
Никак не соображу в чем прикол Создаю Frame (File -> New Frame) Показываю его на основной форме
Все замечательно На фрейv вешаю TButton с обработчиком
Опять же все красиво, фрейм разрушается без последствий Добавляю TSpeedButton с таким же обработчиком, и вуаля - вылетает AV " EAccessVialation .... Access Violation at address 00010017.Write of address 00008100" В интернете по данной теме ничего не нашел. Может кто прольет свет на данный вопрос ? Delphi 5, Windows XP SP2 Delphi 5 |
||||
|
|||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
||||
|
||||
| DmiSbr |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 14.4.2010 Репутация: нет Всего: нет |
Зы
Странно, но ведь для TButton я никакой специальной обработки по уничтожению не пишу, и при этом все нормально |
|||
|
||||
| DmiSbr |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 14.4.2010 Репутация: нет Всего: нет |
2 kami
Спасибо за ссылку Теперь все работает замечательно Обработчик для кнопки
Объявляем приемщик сообщения:
|
||||||
|
|||||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 7 Всего: 17 |
Из факта "один раз проскочил" не надо делать вывод "всегда так делать"... Посмотрите ссылки: 1. http://forum.vingrad.ru/topic-301514.html (поиск по фразе "Купите красивую рамочку" или "Запрещается уничтожать объекты") 2. http://www.delphikingdom.com/asp/answer.asp?IDAnswer=76938 (моё сообщение и ссылка в нём) |
|||
|
||||
| БелАмор |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 7 Всего: 17 |
Фраза, которую можно понимать по-разному... Если интерпретировать её как "я же кнопку не удаляю сам, как же она удалится?", то ответ будет таков: При своём уничтожении компонент удаляет другие компоненты, для которых он является: а) Владельцем (Owner'ом) б) Родителем (Parent'ом) Владелец - это тот, кто ответственен за уничтожение тех, кем он владеет при своём уничтожении. Владелец назначается при вызове конструктора, например: TButton.Create(Self). Всем компонентам, расположенным на форме или фрейме (независимо от того, непосредственно или на других элементах, например, панелях), Owner'ом назначается именно эта форма или фрейм. Именно поэтому при уничтожении формы всё, что на ней расположено, будет уничтожено автоматически (в том числе невизуальные компоненты вроде датасетов). Родитель - это тот, на чём лежит контрол визуально, например, панель, на которой лежит кнопка. Панель при своём уничтожении будет также уничтожать кнопку, лежащую на ней.
Здесь нет необходимости уничтожать кнопку самостоятельно. При своём уничтожении фрейм её уничтожит в любом случае. И ещё... Вы не уловили самого главного: зачем вообще нужен финт ушами с сообщением... А нужен он для того, чтобы уничтожением объекта занимался кто-то, кто не являетя обработчиком ни одного из уничтожаемых объектов и не вызывается из этих обработчиков. Это достигается тем, что в обработчике нажатия кнопки посылается сообщение тому, кто будет заниматься уничтожением, после чего происходит выход из обработчика. И вот только после этого кто-то внешний, кому было послано сообщение, начинает обработку сообщения и уничтожает тех, на кого ему показали. Таким образом, обработчик сообщения не должен быть обработчиком ни для фрейма, ни для кнопки. Сделайте его обработчиком для формы. И передавайте ссылку не на кнопку, а на фрейм. P.S. Загляните ещё раз по ссылке, приведённой kami - я там добавил комментарий, который вам может быть небезынтересен. Это сообщение отредактировал(а) БелАмор - 23.8.2010, 02:59 |
||||
|
|||||
| DmiSbr |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 14.4.2010 Репутация: нет Всего: нет |
2 БелАмор
Большое спасибо за подробное объяснение Про "ответственных" за уничтожение объектов я знаю. При разрушениии обычной формы уничтожаются все компоненты принадлежащие ей. В том числе и кнопки, которые вызывают закрытие формы. При этом дополнительных телодвижений вроде как не требуется. Достаточно написать
Такого же мнения я был о фрейме. И често говоря был сильно удивлен, что нужны дополнительные финты.
Просто мне не хотелось загрязнять код главной формы обработкой уничтожения фреймов. Так как будто красивее получилось. Может я и не прав.
Ссылка очень полезная. Еще раз Огромное спасибо |
||||||
|
|||||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 7 Всего: 17 |
Close не уничтожает форму, а закрывает, т.е. делает её невидимой. Скрытую форму при желании можно опять показать (и там будут все те же данные, которые были перед закрытием). А уничтожается форма точно так-же, как и всё остальное - через вызов Free. И в отношении форм точно так-же сохраняется запрет на самоуничтожение из своего обработчика, только у форм есть метод Release, который может вызываться в обработчике и приводит к уничтожению формы не сразу, а после выхода из всех обработчиков. Косвенный способ вызова Release - в обработчике OnClose формы параметру Action, передаваемому по ссылке, присвоить значение caFree. |
|||
|
||||
![]()
|
| Правила форума "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. |