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

vvvvvvf 08.07.2009 14:07

Как получить переменную внутри функции обработчика события?
 
Доброго времени суток.
Столкнулся с такой проблемой, мне нужно реализовать определенное количество контейнеров (количество контейнеров получаю с сервера), и к каждому контейнеру нужно прицепить свой Timer. Чтобы реализовать это я создаю массив Timer-ов и каждый Timer в функции обработчике должен знать свой индекс.

Тут такая проблема как получить свой i в функции обработчике?
в данном коде всегда возвращается 10 и это понятно, а как сделать чтобы возвращался свой i, то есть 1, 2, 3 и т.д?

Код #1
Код AS3:

package {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class myClass extends Sprite {
                private var myTimer:Array = new Array();
 
                public function myClass():void {
                        for (var i:int = 0; i < 10; i++) {
                                myTimer[i] = new Timer(1000);
                                myTimer[i].start();
                                myTimer[i].addEventListener(TimerEvent.TIMER, function (e:*) {
                                        trace('Как тут получить доступ к своей переменной i?');
                                        trace('i:'+i); // во всех 10 обработчиках, выдает 10
                                });
                        }
                }
        }
}

или такой более правильный код, как тут получить у каждого свой i?

Код #2
Код AS3:

package {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class myClass extends Sprite {
                private var myTimer:Array = new Array();
 
                public function myClass():void {
                        for (var i:int = 0; i < 10; i++) {
                                myTimer[i] = new Timer(1000);
                                myTimer[i].start();
                                myTimer[i].addEventListener(TimerEvent.TIMER, doTime);
                        }
                }
                public function doTime(e:TimerEvent):void {
                        trace('Как тут получить доступ к своей переменной i?');
                        trace('i:'+i);
                }
        }
}



или вопрос можно поставить так: Как расширить экземпляр myTimer[i] и добавить в него например свойство id, чтобы выглядело так?

Код #3
Код AS3:

package {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class myClass extends Sprite {
                private var myTimer:Array = new Array();
 
                public function myClass():void {
                        for (var i:int = 0; i < 10; i++) {
                                myTimer[i] = new Timer(1000);
                                // каким-то чудесным способом мы
                                // тут добовляем экземпляру
                                // новое свойство id
                                myTimer[i].id;
                                // а тут уже присваиваем этому
                                // свойству само значения переменной i
                                myTimer[i].id = i;
                                myTimer[i].start();
                                myTimer[i].addEventListener(TimerEvent.TIMER, doTime);
                        }
                }
                public function doTime(e:TimerEvent):void {
                        // а в самой функции обработчеке мы уже
                        // достаем это свойство id и
                        // присваиваем его к переменной i
                        var i:Number = e.currentTarget.id;
                        trace('i:'+i);
                }
        }
}

И еще раз повторю вопрос для тех кто ничего не понял:
Как расширить экземпляр myTimer[i] и добавить в него свойство id?

Gal4enochek 08.07.2009 14:18

Например так
Код AS3:

package utils
{
        import flash.utils.Timer;
 
        public class MyTimer extends Timer
        {
                public var id :int;
 
                public function MyTimer(delay:Number, id:int, repeatCount:int=0)
                {
                        super(delay, repeatCount);
                        this.id = id;
                }
 
        }
}

и вызов
Код AS3:

        for (var i : int = 0; i<5; i++){
                var t :MyTimer = new MyTimer(1000, i);
                t.start();
                t.addEventListener(TimerEvent.TIMER, te);
        }       
 
        private function te(e :TimerEvent):void{
                trace(e.target.id);
        }


iNils 08.07.2009 14:20

Третий вариант вполне ничего или напишите класс TimerID унаследованный от Timer, и опишите в нем это свойство.

dimarik 08.07.2009 14:26

А зачем Вам вообще этот i? Сделате класс контейнера в котором композицией пропишите таймер. Диспатчите TimerEvent от имени контейнера. Подпишите контроллер на этот эвент. Делов-то!

wvxvw 08.07.2009 14:28

Если вы добавили таймер в массив, то у него уже есть индекс - его положение в массиве. Но лучше для таких целей использовать Dictionary, т.как в массив один и тот же таймер можно добавить много раз, а в Dictionary - только 1. Не вижу большого смысла в создании дополнительных классов только ради одного свойства. Кроме того, я бы не стал создавать много таймеров - а один, и подисывался / отписывался от него, когда нужно.

vvvvvvf 08.07.2009 14:59

Меня вообще не устраивает тот факт, что я должен ради этого создавать отдельный класс который будет расширяться от Timer, то есть (MyTimer extends Timer), можете дать пример где не надо создавать отдельный класс, а прямо в текущем коде (Код #3) можно расширить экземпляр экземпляр myTimer[i] и добавить в него свойство id?

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

Сообщение от iNils (Сообщение 833932)
Третий вариант вполне ничего.

Можете дать какой нибудь пример как можно правильно реализовать задуманный третий вариант?

wvxvw 08.07.2009 15:03

>> а прямо в текущем коде (Код #3) можно расширить экземпляр экземпляр myTimer[i] и добавить в него свойство id?

Дык, говорю же, не нужно ничего расширять - вам нужен индекс из массива -
Код AS3:

var array:Array = [timer1, timer2];
trace(array.indexOf(timer1));

но лучше Dictionary
Код AS3:

var d:Dictionary = new Dictionary();
d[timer1] = 1;
d[timer2] = 2;
trace(d[timer1]);


iNils 08.07.2009 15:06

Класс Timer не динамический, поэтому "расширять" экземпляры нельзя. Вообще "расширять экземпляры" и "не устраивает тот факт.." это с ног на головы, должно быть как раз наоборот.

dimarik 08.07.2009 15:08

Цитата:

Сообщение от vvvvvvf (Сообщение 833948)
можете дать пример где не надо создавать отдельный класс, а прямо в текущем коде расширить экземпляр экземпляр myTimer[i]

Это были люди большого богатства. Но они хотели странного. (с) АБС

vvvvvvf 08.07.2009 15:11

Жизненных ситуаций очень много и я все же хотел был знать как расширять текущий экземпляр не создавая новый класс.

Например в таком коде:
Код AS3:

package {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class myClass extends Sprite {
                private var myTimer:Timer;
 
                public function myClass():void {
                        var i:Number = 0;
                        myTimer = new Timer(1000);
                        // каким-то чудесным способом мы
                        // тут добовляем экземпляру
                        // новое свойство id
                        myTimer.id;
                        // а тут уже присваиваем этому
                        // свойству само значения переменной i
                        myTimer.id = i;
                        myTimer.start();
                        myTimer.addEventListener(TimerEvent.TIMER, doTime);
                }
                public function doTime(e:TimerEvent):void {
                        // а в самой функции обработчеке мы уже
                        // достаем это свойство id и
                        // присваиваем его к переменной i
                        var i:Number = e.currentTarget.id;
                        trace('i:'+i);
                }
        }
}


вот еще раз повторю вопрос:
Как в текущей ситуации экземпляру myTimer присвоить новое свойство id не создавая отдельный класс?


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

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