Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.01.2012, 19:18
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 1  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
По умолчанию Событие закрытия окна

С наступившим всех!
Вопрос каждый раз вводит в ступор на протяжении 1,5 лет (все эти 1,5 лет решался костылями различной степени кривости). Ну хоть раз то надо попытаться спросить, вдруг у кого есть элегантное решение.

Условие (к реальности отношения не имеет, просто для объяснения):
1. Есть окно авторизации
Код:
                         [x] <- кнопка закрыть
[ поле ввода имени ]
[ ok ] [ отмена ]
2. По его закрытию возможны варианты:
- закрыли по кнопке омена
- закрыли крестиком
- закрыли по кнопке ok ( в этом случае надо передать имя пользователя в колбек )
3. Обязательно надо знать что окно закрыто впринципе, чтобы продолжить приостановленную анимацию например
4. И тут начинаются проблемы:
Код AS3:
window.addEventListener(WindowEvent.CLOSE, onWindowClose);
window.addEventListener(CustomWindowEvent.OK_CLICK, onOkClick);
А проблемы в том, что при закрытии по OK_CLICK, событие CLOSE посылается тоже.
Впринципе посылается и посылается, но нам надо при закрытии по крестику и закрытии по OK делать разные вещи. Т.е. при закрытии по OK нам не надо говорить "извините, введите имя".
И начинается:
если сработало OK_CLICK, отписываемся от события CLOSE или начинается лепка флагов.

Как вообще организовать эти события закрытия окон по-человечески, чтобы не думать какой колбек раньше сработает?

Старый 05.01.2012, 19:44
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 2  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 612
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Наверное по кнопке OK не диспатчить событие закрытия окна? Что за window - самописный?

Старый 05.01.2012, 19:44
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 3  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
А зачем здесь вообще каст. события? Я не знаю как вам лучше, но я бы ловил клик мыши, затем смотрел бы по какому объекту клик был сделан: если по ок - проверяем поле ввода имени пользователя и пр., если другое - закрываем окно, делаем что то другое...

Старый 05.01.2012, 19:47
Jewelz вне форума Посмотреть профиль Отправить личное сообщение для Jewelz Найти все сообщения от Jewelz
  № 4  
Ответить с цитированием
Jewelz
 
Аватар для Jewelz

Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
- можно добавить в ваш оконный класс параметр, дистпатчить ли CLOSE при закрытии, т.е в первом случае при клике вызываем hide(), во втором hide(false)

- можно в окне ставить флаг, что имя введено и при close узнавать у окна, введено ли имя (т.е. обойтись одним событием)

а вобще если все хотите обрабатывать в одном хендлере, как раз и будут получаться флаги и тому прочее, лучше слушать разные события, просто клик по крестику и кнопке "отменить" будут диспатчить одно событие, кнопка "ок" - другое
__________________
low +

Старый 05.01.2012, 19:52
crazyone вне форума Посмотреть профиль Отправить личное сообщение для crazyone Найти все сообщения от crazyone
  № 5  
Ответить с цитированием
crazyone
 
Аватар для crazyone

блогер
Регистрация: Nov 2007
Адрес: Киев
Сообщений: 557
Записей в блоге: 2
Это не просто окно, а диалоговое окно. Поэтому логично сделать
Код AS3:
loginWindow=new DialogWindow();
loginWindow.addEventListener(DialogEvent.ANSWER,loginAnswerHandler);
...
function loginAnswerHandler(event:DialogEvent){
  switch(event.btnCode){
    case DialogButtons.OK:
      login();
    break;
    case DialogButtons.CANCEL:
    case DialogButtons.CLOSE:
      if(!canCloseLoginDialog()){
        event.preventDefault();
        showWarning("Thou shalt not close this window!");
      }
    break;
  }
}
Код AS3:
public class DialogWindow extends ...{
...
   private function buttonClick(btnCode:String){
      var event:DialogEvent=new DialogEvent(DialogEvent.ANSWER,btnCode);
      dispatchEvent(event);
      if(!event.isDefaultPrevented()){
         close();
      }
   }
...
}
__________________
aka doctorstal

Старый 05.01.2012, 20:18
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 6  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Наверное по кнопке OK не диспатчить событие закрытия окна? Что за window - самописный?
Угу, самопал (за историю был написан не один), причем у писаного не мной аналога такие же проблемы.
Цитата:
А зачем здесь вообще каст. события? Я не знаю как вам лучше, но я бы ловил клик мыши, затем смотрел бы по какому объекту клик был сделан: если по ок - проверяем поле ввода имени пользователя и пр., если другое - закрываем окно, делаем что то другое...
Да Вы что? Код, запускающий диалог, будет копаться в его внутренностях? Там же концов не найдешь потом, во всяком случае автор такого подхода был жестоко замучен вопросами типа "Что здесь означает (event.currentTarget.parent as MyPanel).selectedValue?". И как-бы преимуществ нет никаких.

Цитата:
- можно добавить в ваш оконный класс параметр, дистпатчить ли CLOSE при закрытии, т.е в первом случае при клике вызываем hide(), во втором hide(false)

- можно в окне ставить флаг, что имя введено и при close узнавать у окна, введено ли имя (т.е. обойтись одним событием)

а вобще если все хотите обрабатывать в одном хендлере, как раз и будут получаться флаги и тому прочее, лучше слушать разные события, просто клик по крестику и кнопке "отменить" будут диспатчить одно событие, кнопка "ок" - другое
Т.е. в 2-х словах отразить состояние закрытия в поле окна? Может быть. Но что-то помешало мне принять такой варинат, не помню...


2 crazyone:
во-во, такой подход в последнем проекте используем. Только с целочисленными, а не строковыми ключами выхода. Т.е. функция закрытия базового окна принимает ключ закрытия, 0 - это крестик или Cancel, а что значат 1,2 и т.д. определяется в окнах-наследниках (в статических константах на классе окна).
Тут проблемы возникли с передачей чего-то большего, чем код возврата. Еще свичи смущают.

Видимо самый адекватный вариант взять эту схему и расширить метод close(closeCode) до close(closeCode:int, data:Object = null); С типизацией тут все равно лучше ничего не придумаешь, а свитчи - они не кусаются и в обработке закрытия диалогов ещё _не_ вредили.


Последний раз редактировалось expl; 05.01.2012 в 20:23.
Старый 05.01.2012, 21:31
crazyone вне форума Посмотреть профиль Отправить личное сообщение для crazyone Найти все сообщения от crazyone
  № 7  
Ответить с цитированием
crazyone
 
Аватар для crazyone

блогер
Регистрация: Nov 2007
Адрес: Киев
Сообщений: 557
Записей в блоге: 2
Относительно передачи данных - я добавлял в DialogEvent атрибут data и все нужное (состояние диалога) не гнушаясь пихал туда.
Можно еще в DialogWindow добавить метод getData.
Или сохранять данные диалога в модели и потом при надобности - из нее доставать...

Вопрос передачи данных - вопрос глобальный, мне кажется. Его нужно рассматривать в контексте всей архитектуры проекта =)
__________________
aka doctorstal

Старый 05.01.2012, 23:34
olexandr вне форума Посмотреть профиль Отправить личное сообщение для olexandr Посетить домашнюю страницу olexandr Найти все сообщения от olexandr
  № 8  
Ответить с цитированием
olexandr
 
Аватар для olexandr

Регистрация: Aug 2007
Адрес: Ukraine, Kyiv
Сообщений: 643
Отправить сообщение для olexandr с помощью ICQ Отправить сообщение для olexandr с помощью MSN Отправить сообщение для olexandr с помощью Skype™
кнопка "X" (закрыть), грубо говоря, вообще ничего не должна диспатчить.
у любого диалогового окна должна быть дефолтная кнопка. соответственно, клик по крестику нажимает дефолтную кнопку и все.
остается, только Ok и Cancel - вот по ним и нужно диспатчить два разных события.
p.s. все субьективно. так бы делал я.
__________________
сайт, vk

Старый 06.01.2012, 00:02
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
crazyone, проще if (super.dispatchEvent(...)) this.close();

Старый 06.01.2012, 00:46
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Сообщение от crazyone Посмотреть сообщение
Относительно передачи данных - я добавлял в DialogEvent атрибут data и все нужное (состояние диалога) не гнушаясь пихал туда.
Видимо, так и буду делать на боевом проекте. Сейчас на своем UI-велосипеде попробовал - вроде проблем нет, уровень маразма только снизился.

Цитата:
Можно еще в DialogWindow добавить метод getData.
Или сохранять данные диалога в модели и потом при надобности - из нее доставать...
Ну это про окна, которые можно/нужно осведомлять о модели - с этим проблем не было.
Я запарился именно с закрытием диалога.

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:32.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:32.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.