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

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

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

Регистрация: Feb 2011
Сообщений: 11
Question Специфичная реализация оконного интерфейса.

Вопрос уважаемому сообществу:

Имеется задача - реализация на AS3 нескольких классов оконного интерфейса для взаимодействия с пользователем. Требования к классам - они должны быть максимально просты в использовании. В идеале, класс должен создавать окно одной строчкой.

Нужны окна нескольких видов. Самый простейший, сходный с "Alert" уже есть. Окно представляет из себя объект с рамкой, TextField, и кнопкой (которая его закрывает и удаляет из сцены).

При вызове

Код AS3:
this.addChild(new AlertWindow("ALERT!"));
создается окно с текстом "ALERT!", которое можно только закрыть.
Тут все достаточно просто.

А вот далее я застрял с реализацией простейшего диалогового окна. Т.е. его функции: вывести текст и две кнопки снизу для выбора - да/нет. Застрял не потому что не знаю как вообще это сделать, а потому, что не могу сообразить - а возможно ли упростить будущее использование до вот примерно такой конструкции:

Код AS3:
var questionWindow:QuestionWindow = new QuestionWindow("Some question");
var answer:Boolean = questionWindow.takeAnswer();
Смысл этого кода - чтобы когда программа дойдет до второй строчки, она вызвала метод takeAnswer созданного окна, а тот уже ожидал решения пользователя, и вернул ответ, когда это решение поступит. Выполнение же программы в основном объекте (там где находится этот вызов) просто приостанавливается.
Это окно действительно должно блокировать все остальное, пока не будет получен этот ответ.

Сейчас у меня гуляют мысли по поводу организации ожидания в методе takeAnswer с помощью цикла while с условием проверки одного из свойств этого самого объекта работающего как флаг - готов/не готов. Изменится же он должен когда сработает обработчик события от кнопки. Но тут получается, что должно параллельно исполняться два потока - первый в методе takeAnswer, а второй в этом самом обработчике. И вот тут все зависит от того - работает ли флеш многопоточно со своими программами, или в каждый момент времени обрабатывается только один поток. В первом случае, по идее должно сработать, а во втором, цикл в takeAswer просто завесит программу, т.к. параллельно возникшее событие от кнопки просто не будет обработано...

Так вот вопрос: возможна ли такая реализация на AS3 принципиально? Или это идиотская затея в связи с принципами работы языка? Просто не хочется тратить время на заведомо невозможный вариант. Если же возможно - подробности не обязательны.


Да, и еще. Буду очень благодарен если кто-нибудь ткнет меня в ссылку по справочным материалам подобных направлений - реализации окон на AS3. Может перестану велосипеды изобретать.

Старый 25.05.2011, 15:59
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 2  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
И вот тут все зависит от того - работает ли флеш многопоточно со своими программами, или в каждый момент времени обрабатывается только один поток.
Поток только один. Используйте события.
Цитата:
Это окно действительно должно блокировать все остальное, пока не будет получен этот ответ.
Можно отключить реакцию на мышиные события для "всего остального", либо перекрыть спрайтом, по-типу того же алерта.
__________________
משיח לא בא
משיח גם לא מטלפן

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

Регистрация: May 2008
Адрес: {0,0}
Сообщений: 754
Записей в блоге: 1
Отправить сообщение для DaFive с помощью ICQ
Подкладывать под окно прозрачную область, чтобы не тыркалось никуда и к примеру передавать в конструктор окна ссылку на callback функцию, которая будет обрабатывать нажатия кнопок в этом окне.
__________________
Кодинг, багинг, алгоритминг. me @

Старый 25.05.2011, 16:26
Slant вне форума Посмотреть профиль Отправить личное сообщение для Slant Найти все сообщения от Slant
  № 4  
Ответить с цитированием
Slant

Регистрация: Feb 2011
Сообщений: 11
Цитата:
Сообщение от alatar Посмотреть сообщение
Поток только один. Используйте события.
Спасибо. Значит не пройдет такой номер. Буду думать в другом направлении.

Хочется получить на выходе максимально простой в использовании набор окон. В идеале - чтобы вызов нужной функциональности сводился к одной строчке...

Старый 25.05.2011, 16:42
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 5  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Когда я делал модальное окно, то тупо создавал полупрозрачный спрайт на весь стэйдж.
Поверх него уже само окно.

окошко можно и так сделать
Код AS3:
// конструктор
public fucntion Window(onOk:Function, onCancel:Function)
{
okButton.addEventListener(MouseEvent.CLICK, onOk);
...
}
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 25.05.2011 в 16:47.
Старый 25.05.2011, 16:50
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 6  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
почему-бы не сделать проще:
Код AS3:
var mc:Sprite=new dialog_sprite();
var popup:Popup=new Popup(mc);
popup.show();
на mc вешаем лисенеры для обработки нажатия кнопок (с weakRefference=true)
popup содержит только бэкграунд и, переданный в конструктор спрайт. При вызове show все плавно появляется.
Преимущества - всего 1 класс Popup для всех окон

Старый 25.05.2011, 17:05
Slant вне форума Посмотреть профиль Отправить личное сообщение для Slant Найти все сообщения от Slant
  № 7  
Ответить с цитированием
Slant

Регистрация: Feb 2011
Сообщений: 11
Тут у меня основная проблема не в том, как заблокировать остальное, а в том, как свести к минимуму количество телодвижений в коде основной функции, нужных для вызова окна, и получения результата из него...

Одной строчкой пока обходиться не получается. И, похоже не выйдет в принципе. Кроме строчки с генерацией окна, еще как минимум еще отдельно приемник нужен. Причем отдельной функцией...

2:undefined - В этом что-то есть... Но тут в общем, то же самое - ни mc, ни popup не могут вернуть данные о выборе пользователя прямо туда же где были сами вызваны - т.е. нельзя как-то продолжить исполнение программы сразу после строчки popup.show(); и при этом уже зная - что там пользователь нажал...

Старый 25.05.2011, 17:06
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 8  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Вывод окна одной строчкой )
Код AS3:
public static function show(text:String = "", title:String = "", flags:uint = 0x4, parent:Sprite = null, closeHandler:Function = null, iconClass:Class = null, defaultButtonFlag:uint = 0x4, moduleFactory:IFlexModuleFactory = null):Alert
{
   ...
}
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 25.05.2011, 17:17
Slant вне форума Посмотреть профиль Отправить личное сообщение для Slant Найти все сообщения от Slant
  № 9  
Ответить с цитированием
Slant

Регистрация: Feb 2011
Сообщений: 11
Цитата:
Вывод окна одной строчкой
Ну, вывод и у меня получался - в первом посте о Alert-подобном окне. Но оно-то не должно ничего возвращать...
А вот тут меня заинтересовало - из примера видно, что show возвращает тип Alert - это что? Неужели все-же данные о результатах взаимодействия с пользователем? Или, все-же, это просто код ошибки если таковая случилась при выводе?

Старый 25.05.2011, 17:26
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 10  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Нет, это собственно сам Alert (это его статичный метод). Данные будут возвращены в функцию указанную как closeHandler или можно подписаться на событие CloseEvent у возвращенного инстанса.

Добавлено через 2 минуты
Еще раз. Все выполняется в одном потоке (есть нюансы, но они в вашем случае, роли не играют). Если запустить цикл, то приложение будет "висеть" пока не отработает цикл (или пока не вылетит по таймауту). Данные можете вернуть либо через колбэк, либо считать по событию.
__________________
משיח לא בא
משיח גם לא מטלפן


Последний раз редактировалось alatar; 25.05.2011 в 17:29.
Создать новую тему Ответ Часовой пояс GMT +4, время: 02:49.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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