![]() |
Событие закрытия окна
С наступившим всех!
Вопрос каждый раз вводит в ступор на протяжении 1,5 лет (все эти 1,5 лет решался костылями различной степени кривости). Ну хоть раз то надо попытаться спросить, вдруг у кого есть элегантное решение. Условие (к реальности отношения не имеет, просто для объяснения): 1. Есть окно авторизации Код:
[x] <- кнопка закрыть- закрыли по кнопке омена - закрыли крестиком - закрыли по кнопке ok ( в этом случае надо передать имя пользователя в колбек ) 3. Обязательно надо знать что окно закрыто впринципе, чтобы продолжить приостановленную анимацию например 4. И тут начинаются проблемы: Код AS3:
Впринципе посылается и посылается, но нам надо при закрытии по крестику и закрытии по OK делать разные вещи. Т.е. при закрытии по OK нам не надо говорить "извините, введите имя". И начинается: если сработало OK_CLICK, отписываемся от события CLOSE или начинается лепка флагов. Как вообще организовать эти события закрытия окон по-человечески, чтобы не думать какой колбек раньше сработает? |
Наверное по кнопке OK не диспатчить событие закрытия окна? Что за window - самописный?
|
А зачем здесь вообще каст. события? Я не знаю как вам лучше, но я бы ловил клик мыши, затем смотрел бы по какому объекту клик был сделан: если по ок - проверяем поле ввода имени пользователя и пр., если другое - закрываем окно, делаем что то другое...
|
- можно добавить в ваш оконный класс параметр, дистпатчить ли CLOSE при закрытии, т.е в первом случае при клике вызываем hide(), во втором hide(false)
- можно в окне ставить флаг, что имя введено и при close узнавать у окна, введено ли имя (т.е. обойтись одним событием) а вобще если все хотите обрабатывать в одном хендлере, как раз и будут получаться флаги и тому прочее, лучше слушать разные события, просто клик по крестику и кнопке "отменить" будут диспатчить одно событие, кнопка "ок" - другое |
Это не просто окно, а диалоговое окно. Поэтому логично сделать
Код AS3:
Код AS3:
|
Цитата:
Цитата:
Цитата:
2 crazyone: во-во, такой подход в последнем проекте используем. Только с целочисленными, а не строковыми ключами выхода. Т.е. функция закрытия базового окна принимает ключ закрытия, 0 - это крестик или Cancel, а что значат 1,2 и т.д. определяется в окнах-наследниках (в статических константах на классе окна). Тут проблемы возникли с передачей чего-то большего, чем код возврата. Еще свичи смущают. Видимо самый адекватный вариант взять эту схему и расширить метод close(closeCode) до close(closeCode:int, data:Object = null); С типизацией тут все равно лучше ничего не придумаешь, а свитчи - они не кусаются и в обработке закрытия диалогов ещё _не_ вредили. |
Относительно передачи данных - я добавлял в DialogEvent атрибут data и все нужное (состояние диалога) не гнушаясь пихал туда.
Можно еще в DialogWindow добавить метод getData. Или сохранять данные диалога в модели и потом при надобности - из нее доставать... Вопрос передачи данных - вопрос глобальный, мне кажется. Его нужно рассматривать в контексте всей архитектуры проекта =) |
кнопка "X" (закрыть), грубо говоря, вообще ничего не должна диспатчить.
у любого диалогового окна должна быть дефолтная кнопка. соответственно, клик по крестику нажимает дефолтную кнопку и все. остается, только Ok и Cancel - вот по ним и нужно диспатчить два разных события. p.s. все субьективно. так бы делал я. |
crazyone, проще if (super.dispatchEvent(...)) this.close();
|
Цитата:
Цитата:
Я запарился именно с закрытием диалога. |
| Часовой пояс GMT +4, время: 09:33. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.