PDA

Просмотр полной версии : Неактивность объекта после addChild()


chester49
19.06.2009, 13:09
Вопрос простой, знаю. И даже знаю что решение должно быть в одну строчку, но не нашел нигде ответа.

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

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


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);
}
}
}


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
у вас кажется проблема с фокусом, вам нужно програмно после добавления перевести фокус на нужный объект.
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.

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


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);
}



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.