Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Как отловить события окон? (http://www.flasher.ru/forum/showthread.php?t=119943)

KaeL 07.01.2009 15:06

Как отловить события окон?
 
Такой вопрос. Есть 2 mxml: главный и окошко.
Main
Код AS3:

...
private function init(event:Event):void
{
  btnNewWindow.addEventListener(MouseEvent.CLICK, onClick);
}
 
private function listeners(event:Event):void
{
  taText.addEventListener(СustWin.CUSTOM, onCustom); //На событие подписан TextArea
}
 
private function onCustom(event:Event):void
{
 trace("CATCHED");                               
}               
 
private function onClick(event:MouseEvent):void
{                                                                          //LINE 26
 var newWindow:NewWindow  = new NewWindow();
 newWindow.open();
}
...

Окошко
Код AS3:

...
public static const CUSTOM:String = 'custom';
 
private function init(event:Event):void
{
 btnEvent.addEventListener(MouseEvent.CLICK, onClick);
}
 
private function onClick(event:MouseEvent):void
{
  dispatchEvent (new Event(CUSTOM));
}
...

Собственно, почему не могу отловить событие CUSTOM в Main?
И попутно вопрос, при компиляции вылазит ошибка :1136: Неправильное количество аргументов. Ожидается 1. Location: line 26 (там просто открывающая скобка...см. в коде). Что это может быть?

DarkLight 07.01.2009 15:25

У каждого окна свой stage и displaylist, а событие выше stage не всплывает.

Описанная ошибка (1136) может быть вызвана тем, что где-то в mxml Вы написали click="onClick" . Если нет - покажите остальной код, так как по приведенным фрагментам причина неясна.

KaeL 07.01.2009 15:47

Собственно кода-то всего ничего, т.к тестил.
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication creationComplete="init(event)" applicationComplete="listeners(event)" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="300" height="200">
        <mx:Script>
                <![CDATA[
 
                        private function init(event:Event):void
                        {
                                btnNewWindow.addEventListener(MouseEvent.CLICK, onClick);
                        }
 
                        private function listeners(event:Event):void
                        {
                                taText.addEventListener(NewWindow.CUSTOM, onCustom);
                        }
 
                        private function onCustom(event:Event):void
                        {
                                trace("CATCHED");                               
                        }
 
                        private function onClick(event:MouseEvent):void
                        {
                                var newWindow:NewWindow  = new NewWindow();
                                  newWindow.open();
                        }
                ]]>
        </mx:Script>
        <mx:Button x="10" y="10" label="New window" id="btnNewWindow"/>
        <mx:TextArea x="10" y="40" width="220" height="111" id="taText"/>
</mx:WindowedApplication>

Окошко
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:Window xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="156" height="84" creationComplete="init(event)">
        <mx:Script>
                <![CDATA[
                        public static const CUSTOM:String = 'custom';
 
                        private function init(event:Event):void
                        {
                                btnEvent.addEventListener(MouseEvent.CLICK, onClick);
                        }
 
                        private function onClick(event:MouseEvent):void
                        {
                                dispatchEvent (new Event(CUSTOM));
                                trace("DISPATCHED");
                        }
                ]]>
        </mx:Script>
        <mx:Button x="10" y="10" label="Event" id="btnEvent"/>
</mx:Window>

Только начал разбираться с AIR.
Не могли бы вы подсказать, как тогда быть? Что использовать вместо событий?
Задумывалось следующее: По нажатию кнопки вызывать окошко, заполнить его данными и при закрытии занести эти данные в DataGrid.

DarkLight 07.01.2009 16:22

Вносим эти исправления:

1)
Код AS3:

dispatchEvent (new Event(CUSTOM,true));//если от окошка ловим, то событие должно всплывать

2)
Код AS3:

var newWindow:NewWindow  = new NewWindow();
newWindow.open();
newWindow.addEventListener(NewWindow.CUSTOM, onCustom);

После этого все ловится.

Логика всплывания событий такова, что событие идет вверх до сцены. А Вы пытались поймать его на текстовом поле в другой сцене, куда оно никогда не дойдет. Почитайте про событийную модель в AS3, все станет понятно.

KaeL 07.01.2009 16:38

Огромное спасибо!

з.ы А та ошибочка так и продолжает мозолить глаз :(

DarkLight 07.01.2009 16:50

Вот код, на котором проверял работоспособность. Ошибка эта у меня не возникает. Разница только в том, что я trace заменил на Alert.show для удобства

Основное приложение:
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication creationComplete="init(event)" applicationComplete="listeners(event)" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="300" height="200">
        <mx:Script>
                <![CDATA[
                        import mx.controls.Alert;
 
                        private function init(event:Event):void
                        {
                                btnNewWindow.addEventListener(MouseEvent.CLICK, onClick);
                        }
 
                        private function listeners(event:Event):void
                        {
                                taText.addEventListener(NewWindow.CUSTOM, onCustom);
                        }
 
                        private function onCustom(event:Event):void
                        {
                                Alert.show("CATCHED");                               
                        }
 
                        private function onClick(event:MouseEvent):void
                        {
                                var newWindow:NewWindow  = new NewWindow();
                                  newWindow.open();
                                  newWindow.addEventListener(NewWindow.CUSTOM, onCustom);
                        }
                ]]>
        </mx:Script>
        <mx:Button x="10" y="10" label="New window" id="btnNewWindow"/>
        <mx:TextArea x="10" y="40" width="220" height="111" id="taText"/>
</mx:WindowedApplication>


NewWindow.mxml
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:Window xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="300" creationComplete="init(event)">
        <mx:Script>
                <![CDATA[
                        public static const CUSTOM:String = 'custom';
 
private function init(event:Event):void
{
 btnEvent.addEventListener(MouseEvent.CLICK, onClick);
}
 
private function onClick(event:MouseEvent):void
{
  dispatchEvent (new Event(CUSTOM,true));
}
                ]]>
        </mx:Script>
        <mx:Button x="95" y="106" label="Button" id="btnEvent"/>
</mx:Window>



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

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