Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Зарегистрировать свой Event для Class`а (http://www.flasher.ru/forum/showthread.php?t=124016)

ERrorMAKros 18.04.2009 16:58

Зарегистрировать свой Event для Class`а
 
Подскажите пожалуйста примерчиком, как для своего объекта в классе описать event, которым бы можно было в дальнейшем пользоваться через

Код AS3:

var MyObj: MyObject = new MyObject();
MyObj.addEventListener(мое_событие_в_классе_MyObject, function_name);

Как описать функцию события в классе:
Код AS3:

package
{
public class MyObject extends MovieClip
  {
  trace('мой обжект инит');
  }
}


cleptoman 18.04.2009 17:18

dispatchEvent + хелп

ERrorMAKros 19.04.2009 14:31

Вот при разборке dispatchEvent столкнулся с такой историей:
Код AS3:

package {
        import flash.events.Event;
        import flash.display.Sprite;
 
        public class IEventDispatcherExample extends Sprite {
 
                private var mainzx:Number=50;                       
 
                public function IEventDispatcherExample() {
                  var decorDispatcher:DecoratedDispatcher = new DecoratedDispatcher();
                      decorDispatcher.addEventListener("doSomething", didSomething);
                      decorDispatcher.dispatchEvent(new Event("doSomething"));
                }
 
                public function didSomething(evt:Event):void
                                {
                      mainzx=1112;
                                          trace('OK');
                }
 
                public function aaaaaaa():Number
                                {
                                        return mainzx;
                                }
        }
}
 
import flash.events.IEventDispatcher;
import flash.events.EventDispatcher;
import flash.events.Event;
 
class DecoratedDispatcher implements IEventDispatcher {     
    private var dispatcher:EventDispatcher;
 
    public function DecoratedDispatcher() {
        dispatcher = new EventDispatcher(this);
    }
 
    public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{
        dispatcher.addEventListener(type, listener, useCapture, priority);
    }
 
    public function dispatchEvent(evt:Event):Boolean{
        return dispatcher.dispatchEvent(evt);
    }
 
    public function hasEventListener(type:String):Boolean{
        return dispatcher.hasEventListener(type);
    }
 
    public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void{
        dispatcher.removeEventListener(type, listener, useCapture);
    }
 
    public function willTrigger(type:String):Boolean {
        return dispatcher.willTrigger(type);
    }
}

И вот исполняемый код:
Код AS3:

import flash.events.Event;
import flash.display.Sprite;
var main: IEventDispatcherExample = new IEventDispatcherExample();
    main.addEventListener("doSomething",mainaaa);
 
function mainaaa(e:Event):void
{var aaaa=main.aaaaaaa();
  trace(aaaa); // ЧТО ТО ТУТ НИЧЕГО НЕ ПОКАЗЫВАЕТ?!! ПОЧЕМУ?
}


wvxvw 19.04.2009 14:57

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

ERrorMAKros 20.04.2009 05:22

А как правильно? ...что то не уловил логики.

wvxvw 20.04.2009 06:11

Ну вот представьте, что происходит, по времени:
  1. начали создавать объект IEventDispatcherExample.
  2. из объекта IEventDispatcherExample раздали всем подписчикам событие (на этот момент подписчиков не было, никто событие не получил).
  3. закончили создавать объект IEventDispatcherExample.
  4. подписались на событие от объекта IEventDispatcherExample, но он его уже давно раздал.

ERrorMAKros 20.04.2009 06:31

А должно происходить как? Суть в том, что мне нужно зарегистрировать "свое" событие, при вызове которого я бы мог получить определенные параметры класса, в данном случае содержимое переменной "mainzx".

wvxvw 20.04.2009 15:39

Ну, подумайте, если вы хотите съесть бутерброд, то, наверное, сначала рот откроете, а потом уже туда бутербродом, правильно? А то если сначала бутерброд, а потом рот открыть - то как-то неудобно получится :)
Смысл подписываться на событие заключается в том, что это самое событие происходит в какое-то неопределенное более позднее время. Поэтому диспатчить событие из конструктора бессмысленно - он все равно всегда вызывается только 1 раз для каждого объекта и вы всегда знаете (можете получить ссылку на этот объект сразу же после его создания - так зачем вам там нужно события диспатчить?
Если ван нужен просто пример - поставьте таймер, и по тику таймера диспачте свое событие.

cleptoman 20.04.2009 18:56

я вот смотрю код и не пойму какую мысль автор хотел донести.(

olexandr 21.04.2009 10:43

Вложений: 1
вот, посмотрите пример. думаю, после него все станет понятно )

p.s. wvxvw, твои ответы, как обычно - супер ;)

ERrorMAKros 22.04.2009 15:33

Спасибо, этот момент выяснили, остался такой фрагмент: почему после создания объекта в момент прослушивания события в Listener`е
Код AS3:

function mainaaa(e:Event):void
{var aaaa=main.aaaaaaa();
  trace(aaaa); // не получаем никаких значений!
}

aaaa - не получила никаких данных, хотя в классе оно имеет значение по умолчанию Number=50 или во время генерирования события принимает значение =1112;

GBee 22.04.2009 15:38

аааа локальная переменнаааая, а если вы про ааааааа() - то это функция, которая видимо не существует, так как по описанию вы думаете, что это переменная.

wvxvw 22.04.2009 15:47

Наверное буков "а" мало написали... ;) По-моему более издевательский способ называть переменные сложно придумать... :D
И не бывает так, чтобы трейс числа не выдал никаких значений - это скорее всего значит, что этот трейс никогда не срабатывает.

Gaen 22.04.2009 15:53

Более издевательский способ - называть переменные lll, llll, lllll, ..., llllllllllllllllll :)

ERrorMAKros 22.04.2009 16:00

Ну хорошо, ...поплнили интернет офтопиком :) ...замечание на тему "имена переменных" - принимаю во внимание, с уважением ;)
Если вы обратите внимние на класс, то увидите там:
Код AS3:

public function aaaaaaa():Number
{
        return mainzx;
}

при вызове в событии:
Код AS3:

var aaaa=main.aaaaaaa();

компилятор не ругается на что то сверх естественное.
Если я вызываю свойства aaaa вне обработчика события, то имею необходимое значение переменной, ...почему он не выводиться в обработчике события?

wvxvw 22.04.2009 16:36

@ GAIKER :
Так нельзя, пайп (|) - это оператор, нельзя его использовать в имени переменной. Но, например, вот такое имя переменной - _______ (7 подчерков) - вполне может быть :)
ПС.... или это I (ай прописная?)

@ ERrorMAKros :
Чудес не бывает, если в вы трейсите число, трейс не может не показать ничего... просто это значит, что при выполнении вашего кода эта функция никогда не вызывается.

Gaen 22.04.2009 17:54

wvxvw, это буква L :)

ERrorMAKros 23.04.2009 02:44

Вложений: 1
Может кто то поковыряет файл?

wvxvw 23.04.2009 03:14

Код AS3:

package
{
        import flash.events.Event;
        import flash.display.Sprite;
 
        public class IEventDispatcherExample extends Sprite
        {
                private var someVariable:Number = 50;
                private var decorDispatcher:DecoratedDispatcher = new DecoratedDispatcher();
 
                public function IEventDispatcherExample()
                {
                        super();
                        decorDispatcher.addEventListener("doSomething", didSomething);
                }
 
                public function someEvent():void
                {
                        decorDispatcher.dispatchEvent(new Event("doSomething"));
                }
 
                public function didSomething(evt:Event):void
                {
                        someVariable = 1112;
                        trace("OK");
                }
 
                public function nextFunction():Number
                {
                        return someVariable;
                }
        }
}
 
import flash.events.IEventDispatcher;
import flash.events.EventDispatcher;
import flash.events.Event;
 
class DecoratedDispatcher implements IEventDispatcher
{     
        private var _dispatcher:EventDispatcher;
 
        public function DecoratedDispatcher()
        {
                super();
                _dispatcher = new EventDispatcher(this);
        }
 
        public function addEventListener(type:String, listener:Function,
                                                useCapture:Boolean = false, priority:int = 0,
                                                useWeakReference:Boolean = false):void
        {
                _dispatcher.addEventListener(type, listener, useCapture, priority);
        }
 
        public function dispatchEvent(evt:Event):Boolean
        {
                return _dispatcher.dispatchEvent(evt);
        }
 
        public function hasEventListener(type:String):Boolean
        {
                return _dispatcher.hasEventListener(type);
        }
 
        public function removeEventListener(type:String, listener:Function,
                                                                        useCapture:Boolean = false):void
        {
                _dispatcher.removeEventListener(type, listener, useCapture);
        }
 
        public function willTrigger(type:String):Boolean
        {
                return _dispatcher.willTrigger(type);
        }
}

Код AS3:

import flash.events.Event;
import flash.display.Sprite;
 
var main:IEventDispatcherExample = new IEventDispatcherExample();
trace("Показываем someVariable до события: " + main.nextFunction());
main.addEventListener('doSomething', event_control);
main.someEvent();
 
function event_control(e:Event):void
{
    trace("----------");      // ПОЧЕМУ ВЕСЬ event_control
    trace("Показываем someVariable во время события: " + main.nextFunction());
    trace("----------");      //  НИЧЕГО НЕ ВЫПОЛНЯЕТ?
}
 
trace("Показываем someVariable после события: " + main.nextFunction());
/**
 * Показываем someVariable до события: 50
 * OK
 * Показываем someVariable после события: 1112
 */

Это ожидаемый результат?
(немного имена подрихтовал, но на таймлайне не трогал. + слушателем принято давать имена отражающие то событие, на которое подписывались, т.е. clickHandler, ну, или в худшем случае handleClick или onClick).

ERrorMAKros 23.04.2009 04:25

Нет, я вижу такой ход событий, должен выполняться код в event_control()
Результат в trace должен получиться:
Код AS3:

/**
 * Показываем someVariable до события: 50
 * Показываем someVariable во время события: 1112
 * Показываем someVariable после события: 1112
 */

Показываем someVariable во время события - не выполняется весь код в функции event_control()

wvxvw 23.04.2009 04:38

А с чего бы ему там быть? main "doSomething" никогда ведь не диспатчит... :confused:

ERrorMAKros 23.04.2009 04:43

Я не понимаю где оно должно дизпатчить :( В каком месте :(

wvxvw 23.04.2009 05:15

Ну, например, вместо:
Код AS3:

public function someEvent():void
{
        decorDispatcher.dispatchEvent(new Event("doSomething"));
}

-->
Код AS3:

public function someEvent():void
{
        dispatchEvent(new Event("doSomething"));
}


ERrorMAKros 23.04.2009 05:21

О! Великолепно! То что нужно! Благодарю!


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

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