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

Akopalipsis 19.06.2013 15:01

узнать о событии в момент создания экземпляра
 
Второй день сижу и просто думаю ,как лучше сделать...Подскажите пожалуйста, как "лучше" или как более "правильнее", можно сделать то ,что у меня ниже в коде?
Код AS3:

package  
{
 
        import flash.display.Sprite ;
        import flash.events.Event ;
 
 
        public class Main extends Sprite
        {
                private var _a : A ;
 
                public function Main()
                {
                        _a = new A( "a" ) ;
                        _a.addEventListener( Event.CHANGE ,aChangeHandler ) ;
                }
                private function aChangeHandler( e : Event ) : void
                {
                        trace( e.type ,_a.str) ;
                }
        }
 
}

Код AS3:

package  
{
        import flash.events.EventDispatcher;
        import flash.events.Event;
 
        public class A extends EventDispatcher
        {
                private var _str : String ;
 
                public function A( str : String )
                {
                        _str = str ;
                        _str += "b" ;
                        dispatchEvent( new Event( Event.CHANGE ) ) ;
                }
                public function get str() : String
                {
                        return _str ;
                }
 
        }
 
}


AlexLucas 19.06.2013 15:23

А зачем вы это делаете ?
У вас есть
Код AS3:

_a = new A( "a" ) ;

Вот объект создался. дальше делайте с ним что хотите.

Akopalipsis 19.06.2013 15:40

Цитата:

А зачем вы это делаете ?
Если б я это знал) Кто то из авторов книг ,которые я читал ,говорит в моей голове ,что нужно использовать конструктор. После прочтения книги о моделях, и двух дней раздумья ,мне наверное, просто требовалось ,чтобы кто то подтвердил ,что ТАК НЕЛЬЗЯ) Спасибо!

maincode 19.06.2013 16:34

:) AlexLucas и Akopalipsis, мне кажется вы друг друга не поняли...

to Akopalipsis: Конструкторы использовать нужно и полезно, при условии что применять их грамотно. Ваш пример не работает потому что вы диспатчите событие CHANGE в конструкторе, т.е. до того как повесится слушатель _a.addEventListener( Event.CHANGE ,aChangeHandler ), поэтому метод aChangeHandler и не срабатывает

Попробуйте так:
Код AS3:

package  
{
 
        import flash.display.Sprite ;
        import flash.events.Event ;
 
 
        public class Main extends Sprite
        {
                private var _a : A ;
 
                public function Main()
                {
                        _a = new A( "a" ) ;
                        _a.addEventListener( Event.CHANGE ,aChangeHandler ) ;
                        _a.changeStr();
                }
                private function aChangeHandler( e : Event ) : void
                {
                        trace( e.type ,_a.str) ;
                }
        }
 
}

Код AS3:

package  
{
        import flash.events.EventDispatcher;
        import flash.events.Event;
 
        public class A extends EventDispatcher
        {
                private var _str : String ;
 
                public function A( str : String )
                {
                        _str = str ;
                }
 
                public function changeStr():void
                {
                        _str += "b" ;
                        dispatchEvent( new Event( Event.CHANGE ) ) ;       
                }
 
                public function get str() : String
                {
                        return _str ;
                }
 
        }
 
}


Akopalipsis 19.06.2013 16:59

maincode Спасибо! Это я понимаю, программа на передачи this в конструктор ,переводит фокус на класс А и событие возникает раньше ,чем в Main завершилась инициализация переменной.
Код с ошибкой я намеренно для примера привёл ,но не сумел правильно сформулировать вопрос.
Вопрос наверное звучать должен... да так он и должен - как лучше обыграть такую ситуацию!
Можно конечно код ,выполнение которого ,вызывает событие ,перенести в отдельный метод и в Main
после передачи значения в класс А и завершения инициализации ,вызвать этот метод.......
Но вот тут у меня пока не вяжется с правильностью таких действий. я грешу на себя и на отсутствие опыта ,тем более после чтения высказываний опытных людей ,которые то и дело говорят о ОПП!
После Вашего совета я прочёл статью о MVC и в моей голове стало только больше туманности.
Там говорится ,что событие мыши ,нужно обрабатывать в другом классе ,да и то по событию чендж.
О том ,что чтобы код заработал ,нужно событие запускать с аргументом null и выходит ,что это хорошо. Но я уверен ,что еслибы я выложил пример ,работа которого бы была такой же ,но названия бы были не MVC ,то мне бы сказали ,что это не правильно)...
Но это я говорю не для того ,что бы сказать ,что кто то не так делает ,а для того ,чтобы по возможности вы понимали .какая каша у меня в голове и давали соответствующие ответы. И возвращаясь к теме - как лучше это сделать?

Добавлено через 4 минуты
Цитата:

Попробуйте так:
Спасибо!)

Добавлено через 1 час 1 минуту
Вот наверное я и приблизился к моменту ,который расставит в моей голове ,все выше сказанное ,на свои места. Но для этого мне нужно понять вот что...Почему в Main не срабатывает событие?
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
                private var _a : A ;
                private var _b : B ;
 
                public function Main():void
                {
                        _a = new A( ) ;
                        _a.addEventListener( Event.CHANGE , changeHandler ) ;
                        _b = new B( this );
                }
                private function changeHandler( e : Event ) : void
                {
                        trace( e.type ) ;
                }
 
        }
 
}

Код AS3:

package  {
        import flash.events.Event;
        import flash.events.EventDispatcher ;
 
        public class A extends EventDispatcher{
 
 
                public function A(  ) {
 
                }
                public function go():void
                {
                        trace( "i - A" ) ;
                        dispatchEvent( new Event ( Event.CHANGE ) ) ;
                }
 
        }
 
}

Код AS3:

package  {
        import flash.display.DisplayObjectContainer;
 
        public class B {
                private var _a : A ;
 
                public function B( con : DisplayObjectContainer ) {
                        _a = new A() ;
                        _a.go() ;
                }
 
        }
 
}


Babylon 19.06.2013 18:21

а где у вас вызов метода с диспатч?

maincode 19.06.2013 18:38

У вас два объекта класса A, один создается в Main, второй - в классе B. Слушателя добавляете в Main-е, а метод go вызываете в классе B.

Наверно как так:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
                private var _a : A ;
                private var _b : B ;
 
                public function Main():void
                {
                        _a = new A( ) ;
                        _a.addEventListener( Event.CHANGE , changeHandler ) ;
                        _b = new B( _a );
                }
                private function changeHandler( e : Event ) : void
                {
                        trace( e.type ) ;
                }
 
        }
 
}


Код AS3:

package  {
        import flash.display.DisplayObjectContainer;
 
        public class B {
                private var _a : A ;
 
                public function B( a : A ) {
                        this._a = a;
                        _a.go() ;
                }
 
        }
 
}


Akopalipsis 19.06.2013 18:43

Цитата:

а где у вас вызов метода с диспатч?
В классе В... То есть получается ,что уведомления получают только те классы ,которые его и вызывают?

Добавлено через 5 минут
maincode Спасибо! значит я неправильно понимаю очень важный момент...Опять читать!)

Добавлено через 14 минут
maincode Спасибо ещё раз!!!
Хорошо что я хоть добавил в конце вышеизложенного сообщения строку о "каше в голове".
А так бы мои слова, как осквернения ОПП бы выглядели)))
Это же разные экземпляры)))))))))

Babylon 19.06.2013 19:28

Зачем учить так писать код? Это же откладывается в голове хуже каши.
Есть отличные видеоуроки artempro.blogspot.ru

Akopalipsis 19.06.2013 19:59

Цитата:

Зачем учить так писать код?
Не знаю к кому Вы обращаетесь ,но в любом случаи - не какого кода нет! У меня был абстрактный вопрос на который я получил ответ! Если конечно есть ,что добавить ,то я только ЗА!
Цитата:

Есть отличные видеоуроки artempro.blogspot.ru
Я не могу оценивать их уровень качества ,потому что - это эталон всех уроков ( я конкретно говорю про мою тему ,другие не смотрел ). я бы урокам мастер - класса был бы рад!)


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

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