![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 2 Всего: 5 |
Не совсем так. Достаточно все-таки посмотреть в TWinControl.Destroy. За окнами следит окно, если речь о детишках. Но главное действие - да, уничтожается хендл. Все-таки надо смотреть: Есть кнопка, и на OnClick вызывается Free для нее же. Что происходит: OnClick кнопки вызывается из обработчика сообщения, WM_LBUTTONUP:
Замечу, что у TButton метод Click перекрыт, но предок вызывается, разумеется. Что видим? В методе Click вызывается обработчик. Допустим, там у нас вызов Free. По стеку выше: при шлепании по кнопке Click вызывается из WMLButtonUp. Смотрим: после вызова Click идет вызов DoMouseUp и MouseUp. Поскольку, я уверен, после выхода из Click объект уже прошел деструктор, а повода предполагать иное нет, то if Assigned(FOnMouseUp) then FOnMouseUp(Self, Button, Shift, X, Y); обращается к полю уже уничтоженного объекта. Это не слишком элегантно. Далее. Уничтожение хендла окна в деструкторе. Предположим, что пользователь сделал doubleClick по кнопке. В этом случае идет два сообщения, если память мне не изменяет. Первое - Click. На нем кнопка вызовет деструктор, в котором, как помянуто, уничтожается окно. Мне интересно, что будет, когда второе сообщение придет на уничтоженный хендл... Но пока: я ошибся где-нибудь или все-таки нет? |
|||
|
||||
| Romkin |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 2 Всего: 5 |
Так. Продолжаю. Я осмелился проверить, что, собственно, происходит. Для этого я написал потомка TButton, немного его поменяв:
Всего лишь просто забиваем память маской при уничтожении. Теперь создадим:
Ну и нажмем. Access violation at address 004038C6 in module 'Project7.exe'. Read of address DADADADA. Нет. Не рекомендуется. Это сообщение отредактировал(а) Romkin - 26.11.2007, 21:07 |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Romkin, на самом деле объект не так просто уничтожается. После вызова деструктора там еще система чего-то химичит
Добавлено @ 21:31 Romkin, более того ошибка возникла в procedure TObject.CleanupInstance; по причине порчи ссылки на VMT Хотя таки код
выполняется после освобождения памяти, а тут обращение к полям объекта. Выходит что неправильно, а жаль... -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Тогда предлагаю такой вариант
Проверка показала, что в WM_CLOSE срабатывает сразу после WMLButtonUp (без задержки), потому все завершается успешно. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Romkin |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 2 Всего: 5 |
Оххх. Сорри. ЗАпутался :(
Немного нехорошо (виноват, но ничего уже в голову не лезет), но при простом закрытии формы - порядок, а при нажатии - Access violation at address 004371D4 in module 'Project7.exe'. Read of address DADADB1E. А WM_CLOSE я бы все-таки через PostMessage сделал. И после hide. Потому что после WM_LBUTTONUP может скользнуть сообщение. |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Да не я дебагом прошел, все отлично. Post прийдет с задержкой. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Mina |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.11.2005 Репутация: нет Всего: нет |
Да, не думал, что все так будет сложно.
Скорее всего я наверно неверно задал вопрос. По идеи мне нужно удалять этой кнопкой фрейм на котором расположена эта кнопка, но при его удалении
возникает ошибка, и как мне кажется из за удаления самой кнопки. Вот код формы:
Код фрейма:
Может так будет проще решить эту проблему |
||||||
|
|||||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 2 Всего: 5 |
Так. Класс фрейма переименуй нормально, и привыкай, что автоматические имена, такие как label1, TFrame2 и тд в коде не пишут. К форме это тоже относится. Block: array of TFrame2; - не нужен тебе, уж поверь. Напиши без него. Не нужно тебе к фрейму обращаться извне, делай так, чтобы фрейм сам обращался куда надо. Тем более, что наращивание массива на 1 постоянно глаза режет ;) |
|||
|
||||
| Mina |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.11.2005 Репутация: нет Всего: нет |
Это я знаю, это было написано для примера. Мне нужно создавать фреймы в Run-time. Как тогда без массива создавать фреймы, чтобы потом можно было бы обращаться к компонентам которые на них расположены? Попробывал, приложение совсем закрывается, а надо чтобы удалялся фрейм. |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 2 Всего: 5 |
Фрейм и без массива хорошо создается. И пиши так, чтобы к компонентам на фрейме не обращаться. Фрейм у тебя - объект. Напиши у него нужные методы и свойства, и обращайся к ним. А лучше вообще не обращаться, с какой целью? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Потому что не тот хэндл (Sender as TControl).perform(WM_CLOSE, 0, 0); -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Mina |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.11.2005 Репутация: нет Всего: нет |
На фрейме находятся другие компоненты (Memo, Edit и др.) Добавлено через 8 минут и 28 секунд Удаляется только кнопка (к стати без ошибки), фрейм со всем остальным остается. |
|||
|
||||
| Rennigth |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Alexeis,
Romkin, ребят, не хочу вас разочаровывать, но: 1. Вариант с посылкой WM_CLOSE подходит только к классу TCustomForm, с выстановленным CloseAction = caFree в OnClose. Согласитесь не универсальный вариант. 2. Про WM_QUIT, WM_DESTROY(WM_NCDESTROY) тоже нечего говорить, они ни каким боком не уничтожат WinControl. Mina, в твоем случае думаю не стоит извращаться, сделай по старинке как в самом начале предлагал MetalFan. В твоем случает это будет выглядеть примерно так:
-------------------- (* Honesta mors turpi vita potior *) |
||||
|
|||||
| Mina |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.11.2005 Репутация: нет Всего: нет |
||||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
TObject(VMsg.WParam).Free
писал в браузер -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
![]()
|
| Правила форума "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. |