![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Mina |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.11.2005 Репутация: нет Всего: нет |
Кнопки создаются в Run-time.
Если возможно, то как удалить кнопки, при нажатии на них самих. Вот код
Что написать в обработчике события кнопки |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 2 Всего: 5 |
Послать сообщение форме с просьбой удалить self. Смотри TForm.Release. Просто делать self.Free крайне не рекомендую.
|
|||
|
||||
| WaReZMEN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 683 Регистрация: 9.6.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 3 |
Можно сделать так
НО, удалять можно будет только в том порядке в котором создавались кнопки... И вообще не рекамендую Это сообщение отредактировал(а) WaReZMEN - 26.11.2007, 13:24 |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Удалить корректно сможет только зачистчик Windows после закрытия программы. Так что я бы рекомендовал просто "скрыть".
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
самое верное из всех приведенных решение имхо. как-то так:
Это сообщение отредактировал(а) MetalFan - 26.11.2007, 15:33 -------------------- There are always someone smarter than you... |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Ага, и словить при этом в большой долей вероятности AV или abstract error, или еще что похуже!! -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Фактически можно сделать так:
Делфи в данный момент никаких ошибок не выдаёт, но теоритически это неправильно, по крайней мере в документации написано, что так делать не рекомендуются - выполнять уничтожение кнопки из события вызванного по её нажатию. Более красивый вариант предложен от MetalFan. Только позволю себе заметить, что правильнее будет указать в обработчике код TObject( AMsg.WParam ).Free; (а не LParam) --------------------
Бери от жизни всё. |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Lexicss, да знаешь ли... взял за правило примеры с ошибочками приводить, чтобы головой думали))))
но здесь реально перепутал, ибо писал на коленке без проверки в IDE -------------------- There are always someone smarter than you... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Никаких проблем не должно быть при простом банальном удалении.
См код.
Все компоненты удаляют себя у родителей. Глюки в чем-то другом. Добавлено через 2 минуты и 25 секунд p.s. пример из первого поста отлично работает. Добавлено через 14 минут и 20 секунд На всякий случай проверил нет ли обращений к полям данных после вызова обработчика OnClick. Действительно нет никаких обращений, вполне допустимые действия. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Проблемы будут не из-за какого-то неправильного дестроя,а в ситуации например такой(код вымышленный):
Что произойдет одному всевышнему известно. Проблемма не в том что именно для кнопки это прокатывает, а в том что мы не знаем, есть ли обращения к полям/методам класса после его разрушения или нет. Это априори опасно!!! -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Для того и учатся правильно писать код. Не писать же код с поправкой на дурака -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 2 Всего: 5 |
TComponent - далеко. TWinControl - оно ближе. А там окно.
Хотя такое выглядит допустимым, но я не уверен. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Детишок контролы определяют как TComponent, потому нужный код следовало искать именно там, а TWinControl как TWinControl у него свой деструктор уничтожающий окно, только и всего. Многие сообщения реализуются именно в TComponent благодаря VCL. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
ню незнаю... имхо на vcl надейся а сам не плошай! -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Rennigth, я уж привык, что логичные вещи в VCL работают так как этого хочеться.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| 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 *) |
|||
|
||||
| Mina |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.11.2005 Репутация: нет Всего: нет |
Rennigth,
Фрейм удаляется, а что на нем находится нет. После удаления и при создании нового фрейма появляются старые. Вот исходник что у меня получилось Присоединённый файл ( Кол-во скачиваний: 3 )
Proba.rar 10,16 Kb |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Mina |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.11.2005 Репутация: нет Всего: нет |
Rennigth, спасибо огромное. То что нужно было.
|
|||
|
||||
![]()
|
| Правила форума "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. |