Форум 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=151178)

mikhailk 26.02.2011 19:10

все очень просто.

у автора стоит абсолютно рабочий код dispatchEvent(new Event(Region.CLICK_REG1)), который почему-то не работает.

что делает разумный человек?
наверное, он проверяет, а приходит ли управление в это место кода - в данном случае, отрабатывает ли метод onClick в классе Region.

как он это делает?
например, он ставит трейс перед фрагментом кода, который не отрабатывает (что я, собственно, и предложил автору)

почему я считаю, что код рабочий?
потому что я взял код автора, переименовал метод с неработающим dispatchEvent(new Event(Region.CLICK_REG1)), вызвал его напрямую и все отработало (см. приведенный фрагмент кода)

DZHETIGAPA 26.02.2011 19:41

Метод onclick в Регионе срабатывает. В этом проблем нет. Но не вызывается в главном классе.

Я еще раз все переписал и откомпилил.

mikhailk 26.02.2011 20:12

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        var reg:Region = new Region();
                        reg.addEventListener(Region.CLICK_REG1, onClick);
                        addChild(reg);
                }
 
                private function onClick(e:Event):void
                {
                        trace("SOS")
                }
 
        }
 
}
 
package 
{
        import flash.display.*;
        import flash.events.*;
 
        public class Region extends MovieClip
        {
 
                public static const CLICK_REG1:String = "clickreg1";
 
                public function Region():void
                {
                        this.graphics.beginFill(0xff0000);
                        this.graphics.drawRect(100, 100, 200, 200);
                        this.graphics.endFill();
 
                        this.addEventListener(MouseEvent.CLICK, onClick);
                }
 
                public function onClick(e:MouseEvent):void
                {
                        trace("onClick");
                        dispatchEvent(new Event(Region.CLICK_REG1))
                }       
 
        }
 
}


Johny_86 27.02.2011 01:03

Тут проблема в следующем. У тебя главный класс создает экземпляр класса Region. В главном классе ты вешаешь обработчик события. Но ты ведь на сцену не добавляешь Region объект. А в Region ты написал, что как только ПО НЕМУ кликнуть, то диспатчится событие. А как же ты по нему кликнешь, если его нету на сцене? ))) раз его нету на сцене, то кликнуть по нему ты не можешь и поэтому продиспатчить событие ты тоже не можешь. Тебе надо либо добавлять его на сцену в главном классе. Либо диспатчить не по клику, а в конструкторе, например.

Котяра 27.02.2011 16:15

Если диспатчить в конструкторе, то никогда не получится подписаться на событие до его диспетчеризации.
В конструкторе диспатчить события нельзя!

mikhailk 27.02.2011 16:24

можно :)
если слушать не на объекте, а на его родителе и баблинг поставить

но не нужно

Котяра 27.02.2011 16:26

Даже если слушатель на родителе - родитель возникает в момент addChild, что позже конструктора полюбому)

mikhailk 27.02.2011 16:36

да, действительно ))

Нет, все-таки можно.
Надо событие отправить на статическую переменную Main.instance (как пример) и ее же слушать.

Котяра 27.02.2011 20:30

Давайте закончим с бредом.
Цитата:

Надо событие отправить на статическую переменную Main.instance (как пример) и ее же слушать.
Я даже понял, что вы имели в виду, но это совсем не в тему.
правило:
В конструкторе диспатчить события нельзя!

Johny_86 28.02.2011 01:07

Цитата:

Сообщение от Котяра (Сообщение 976583)
Если диспатчить в конструкторе, то никогда не получится подписаться на событие до его диспетчеризации.
В конструкторе диспатчить события нельзя!

Cогласен. Не получится. Только если ставить таймер на диспатч, но это все бред ))) Мы говорили почему у него оно не диспатчится. А не диспатчится потому, что кликать не по чему, чтобы задиспатчить.


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

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