![]() |
|
|
![]()
|
|
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
На форме определён обработчик события OnMouseUp. Внутри этого обработчика я пытаюсь создать всплывающее меню, и привязать его элемент(ы) к функции(ям) этой-же формы:
Но в этом варианте при выборе пункта меню не происходит вызова ItemSelected. В случае же создания puMenu и item глобально для класса (т. е. объявление в заголовочном файле, puMenu=new TPopupMenu(this); в конструкторе...) ItemSelected вызывается нормально. Это какое-либо принципиальное ограничение VCL, или я что-то недопонял? Очень хочется не размазывать меню (а их будет много) по пространству имён класса, а компактно создавать/уничтожать только там, где они действительно нужны. |
|||
|
||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
А почему бы вам просто не воспользоваться (мышкой), благо Builder дает большие возможности для этого...
Создаете на форме нужное количество PopupMenu(шек) с нужными действиями и затем привязываете их к конкретным компонентам на форме (для каждого компонента в свойствах есть LINKADE) там есть пункт PopupMenu, в котором выбираете номер нужного меню и все... Ничего писать вообще не надо. У каждого PopupMenu есть свои события , - там и пишите нужные действия. Это сообщение отредактировал(а) SVN74 - 8.1.2010, 13:07 |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Не, мышкой -- не вариант. Не получится. |
|||
|
||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
||||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
1. Консепся такая (не люблю программировать мышью) 2. Уже из принципа хочется разобраться, почему не получился вариант с созданием TPopupMenu "на месте". |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Вот это
|
||||
|
|||||
| EnergoHokum |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
А можно подробнее? Отчего TPopupMenu(NULL), а не TPopupMenu(this), почему item нельзя затолкать в автоуказатель (его удалением займётся puMenu?), и если это "как минимум", то каким должен быть "как максимум"? Что я упустил/неправильно_понял в изначальном варианте? Это сообщение отредактировал(а) EnergoHokum - 8.1.2010, 20:31 |
||||
|
|||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Потому что параметр конструктора TPopupMenu - это его owner. Т.е. тот, кто его будет удалять. Вы же его удаляете сами (через auto_ptr), так что не надо его отдавать форме
|
||||||
|
|||||||
| EnergoHokum |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
А-а-а! Вот, блин, сила привычки! Оказывается, иногда и подумать надо!
Блин, вот хоть прям щас всё бросай, и беги на работу -- так охота проверить предложенный вариант! |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Всегда, на то он и owner. Однако, при явном удалении объекта, он себя удаляет из списка объектов owner'а. Но я бы на это надеятся не стал |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Вышеприведённые изменения на работу не повлияли, по прежнему в случае объявления TPopupMenu в теле обработчика MouseUp не вызываются связанные с TMenuItem-ами обработчики.
Но если объявить TPopupMenu глобально для класса, и проинициализировать в конструкторе -- всё работает корректно. Открытым остаётся вопрос: с чем связано такое поведение, и можно ли его забороть? |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
никак. у тебя объект живет во время обработки события OnMouseUp - создается и уничтожается. Причем настолько быстро - что ты даже этого не замечаешь. Выход - либо сделать указатель на контрол глобальным (не айс), либо как член класса формы (айс). |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Непонятно. Для отображения меню я вызываю у TPopupMenu* метод Popup, собственно. Сразу после выбора пункта меню, когда запускается обработчик -- происходит возврат из Popup-а? Но отчего, в таком случае, не случается access violation, если само меню уже уничтожено? |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
EnergoHokum, здесь все связанно с жизненным циклом объекта. К примеру кнопка никогда не появится:
ибо умный указатель вызовет деструктор по окончании метода. если btn сделать членом класса (или глобально) и выделять и высвобождать память вручную - то все ок - в данном случае, имхо, использовать умные указатели не совсем удобно - но можно. Это сообщение отредактировал(а) mrbrooks - 11.1.2010, 12:02 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
|
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
У меня вообще такое нехорошее ощущение, что в Builder-е не поддерживается вложенность обработчиков событий, а реализуется очередь по типу "выполнен возврат из одного обработчика -- запускаем следующий". |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Поддерживает, и не Builder, а сама Винда. Позови ShowModal от какой нибудь формы в обработчике - получишь по полной программе |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |