Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Неактивность объекта после addChild() (http://www.flasher.ru/forum/showthread.php?t=126451)

chester49 19.06.2009 13:09

Неактивность объекта после addChild()
 
Вопрос простой, знаю. И даже знаю что решение должно быть в одну строчку, но не нашел нигде ответа.

Вкратце о приложении. Есть MC с размещенными на нем текстовыми полями, кнопками, комбобоксами и т.д. У этого МС слушается событие нажатия кнопки с клавиатуры. Далее обработчик проверяет Enter ли эта нажатая кнопка, и если да, то проверяет корректность заполнения полей формы.
Если ответ отрицательный то создается и добавляется на сцену (addChild) экземпляр класса MessageBox (мною созданного) с сообщением о некорректности ввода. У этого экземпляра так же слушается событие нажатия Enter'a.

И...вопрос. Пока я не кликну мышкой на этот MessageBox, то его событие не будет слушаться, а по нажатию Enter'a будет выполняться обработчик головного МС.
Вопрос видимо в активности MessageBox'a. Рыл-рыл что нибудь похожее, так ничего и не нашел.

Код AS3:

                public function AddPurchaseScreen() {
 
                        this.addEventListener(KeyboardEvent.KEY_DOWN, enterPressed);
                }
 
                private function enterPressed(e:KeyboardEvent):void {
                        if (e.keyCode == Keyboard.ENTER) {
                                if ("Проверка корректности"){
                                        var messageBox:MessageBox = new MessageBox();
                                        messageBox.messageTitle.text = "Ошибка";
                                        messageBox.message.text = "Не все данные введены";
                                        this.addChild(messageBox);
                                }
                        }
                }

Код AS3:

                public function MessageBox() {
 
                        this.message = Message;
                        this.messageTitle = MessageTitle;
 
                        this.addEventListener(KeyboardEvent.KEY_DOWN, enterPressed);
                }
 
                private function enterPressed(e:KeyboardEvent):void {
                        if (e.keyCode == Keyboard.ENTER) {
                                this.parent.removeChild(this);
                        }
                }


AlexDesinger 19.06.2009 13:55

у вас кажется проблема с фокусом, вам нужно програмно после добавления перевести фокус на нужный объект.
Код AS3:

stage.focus=myObject


chester49 19.06.2009 14:16

Частично это решило проблему.
Остальное не по данному вопросу.

Спасибо.

Добавлено через 36 минут
Так. Назрела новая проблема.

Значит последовательность действий:
1. Навешиваем слушателя нажатия Enter.
2. Заполняем поля.
3. Жмем Enter.
4. Создаем MessageBox, удаляем с основного МС слушателя Enter'a, чтобы по нажатию Enter обрабатывалось закрытие MessageBox'a.
5. Делаем addChild. Фокусируемся на MessageBox.
6. Жмем Enter. Обработчик закрывает MessageBox и диспатчит событие о том, что бокс закрыт.
7. В основном МС у созданного MessageBox слушается событие закрытия, и когда оно происходит, то на сам МС снова вешается слушатель события нажатия Enter.

Но это не работает...

Код AS3:

                public function AddPurchaseScreen() {
                        this.addEventListener(KeyboardEvent.KEY_DOWN, enterPressed);
                }
 
                private function enterPressed(e:KeyboardEvent):void {
                        if (e.keyCode == Keyboard.ENTER) {
                                if ("Проверка корректности") {
                                        var messageBox:MessageBox = new MessageBox();
                                        this.removeEventListener(KeyboardEvent.KEY_DOWN, enterPressed);
                                        messageBox.messageTitle.text = "Ошибка";
                                        messageBox.message.text = "Не все данные введены";
                                        this.addChild(messageBox);
                                        stage.focus = messageBox;
                                        messageBox.addEventListener("okClicked", errorClosed);
                                }
                        }
                }
 
                private function errorClosed(e:Event):void {
                        this.addEventListener(KeyboardEvent.KEY_DOWN, this.enterPressed);
                }

Код AS3:

                public function MessageBox() {
                        this.addEventListener(KeyboardEvent.KEY_DOWN, enterPressed);
                }
 
                private function enterPressed(e:KeyboardEvent):void {
                        if (e.keyCode == Keyboard.ENTER) {
                                this.parent.removeChild(this);
                                e.target.removeEventListener(KeyboardEvent.KEY_DOWN, enterPressed);
                                this.dispatchEvent(new Event("okClicked"));
                        }
                }


Выглядит все так: ввожу данные, жму Enter, появляется MessageBox, жму Enter и дальше по видимому запускаются обработчики и главного МС и MessageBox'a, т.к. месседж сначала закрывается, а потом снова открывается..

AlexDesinger 19.06.2009 15:17

а вы уверены что листенер с главного MC удаляется?
AddPurchaseScreen() я так понимаю констркутор, если да то сохраните ссылку на "this" в самом классе, чтобы удалить потом листенер в enterPressed.
Вообще потрейсите везде где у вас this - он не во всех частях класса ссылается на один и тот же объект в as3.
Возможно у вас накапливаются слушатели - это и мешает.

iflamberg 19.06.2009 15:46

вообще, чтобы проблем с фокусом не было, вешать слушателей на stage.


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

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