Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Специфичная реализация оконного интерфейса. (http://www.flasher.ru/forum/showthread.php?t=156671)

Slant 25.05.2011 15:27

Специфичная реализация оконного интерфейса.
 
Вопрос уважаемому сообществу:

Имеется задача - реализация на 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. Может перестану велосипеды изобретать. :)

alatar 25.05.2011 15:59

Цитата:

И вот тут все зависит от того - работает ли флеш многопоточно со своими программами, или в каждый момент времени обрабатывается только один поток.
Поток только один. Используйте события.
Цитата:

Это окно действительно должно блокировать все остальное, пока не будет получен этот ответ.
Можно отключить реакцию на мышиные события для "всего остального", либо перекрыть спрайтом, по-типу того же алерта.

DaFive 25.05.2011 16:04

Подкладывать под окно прозрачную область, чтобы не тыркалось никуда и к примеру передавать в конструктор окна ссылку на callback функцию, которая будет обрабатывать нажатия кнопок в этом окне.

Slant 25.05.2011 16:26

Цитата:

Сообщение от alatar (Сообщение 998644)
Поток только один. Используйте события.

Спасибо. Значит не пройдет такой номер. Буду думать в другом направлении.

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

Котяра 25.05.2011 16:42

Когда я делал модальное окно, то тупо создавал полупрозрачный спрайт на весь стэйдж.
Поверх него уже само окно.

окошко можно и так сделать
Код AS3:

// конструктор
public fucntion Window(onOk:Function, onCancel:Function)
{
okButton.addEventListener(MouseEvent.CLICK, onOk);
...
}


undefined 25.05.2011 16:50

почему-бы не сделать проще:
Код AS3:

var mc:Sprite=new dialog_sprite();
var popup:Popup=new Popup(mc);
popup.show();

на mc вешаем лисенеры для обработки нажатия кнопок (с weakRefference=true)
popup содержит только бэкграунд и, переданный в конструктор спрайт. При вызове show все плавно появляется.
Преимущества - всего 1 класс Popup для всех окон

Slant 25.05.2011 17:05

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

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

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

alatar 25.05.2011 17:06

Вывод окна одной строчкой )
Код 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
{
  ...
}


Slant 25.05.2011 17:17

Цитата:

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

alatar 25.05.2011 17:26

Нет, это собственно сам Alert (это его статичный метод). Данные будут возвращены в функцию указанную как closeHandler или можно подписаться на событие CloseEvent у возвращенного инстанса.

Добавлено через 2 минуты
Еще раз. Все выполняется в одном потоке (есть нюансы, но они в вашем случае, роли не играют). Если запустить цикл, то приложение будет "висеть" пока не отработает цикл (или пока не вылетит по таймауту). Данные можете вернуть либо через колбэк, либо считать по событию.


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

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