Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.07.2009, 14:07
vvvvvvf вне форума Посмотреть профиль Отправить личное сообщение для vvvvvvf Найти все сообщения от vvvvvvf
  № 1  
Ответить с цитированием
vvvvvvf
[+1 08.07.09]

Регистрация: Mar 2009
Сообщений: 107
По умолчанию Как получить переменную внутри функции обработчика события?

Доброго времени суток.
Столкнулся с такой проблемой, мне нужно реализовать определенное количество контейнеров (количество контейнеров получаю с сервера), и к каждому контейнеру нужно прицепить свой 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?

Старый 08.07.2009, 14:18
Gal4enochek вне форума Посмотреть профиль Отправить личное сообщение для Gal4enochek Найти все сообщения от Gal4enochek
  № 2  
Ответить с цитированием
Gal4enochek

Регистрация: May 2008
Адрес: Днепропетровск
Сообщений: 151
Отправить сообщение для Gal4enochek с помощью ICQ
Например так
Код 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);
	}

Старый 08.07.2009, 14:20
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 3  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Третий вариант вполне ничего или напишите класс TimerID унаследованный от Timer, и опишите в нем это свойство.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 08.07.2009, 14:26
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
А зачем Вам вообще этот i? Сделате класс контейнера в котором композицией пропишите таймер. Диспатчите TimerEvent от имени контейнера. Подпишите контроллер на этот эвент. Делов-то!
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 08.07.2009, 14:28
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Если вы добавили таймер в массив, то у него уже есть индекс - его положение в массиве. Но лучше для таких целей использовать Dictionary, т.как в массив один и тот же таймер можно добавить много раз, а в Dictionary - только 1. Не вижу большого смысла в создании дополнительных классов только ради одного свойства. Кроме того, я бы не стал создавать много таймеров - а один, и подисывался / отписывался от него, когда нужно.
__________________
Hell is the possibility of sanity

Старый 08.07.2009, 14:59
vvvvvvf вне форума Посмотреть профиль Отправить личное сообщение для vvvvvvf Найти все сообщения от vvvvvvf
  № 6  
Ответить с цитированием
vvvvvvf
[+1 08.07.09]

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

Добавлено через 1 минуту
Цитата:
Сообщение от iNils Посмотреть сообщение
Третий вариант вполне ничего.
Можете дать какой нибудь пример как можно правильно реализовать задуманный третий вариант?


Последний раз редактировалось vvvvvvf; 08.07.2009 в 15:01.
Старый 08.07.2009, 15:03
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
>> а прямо в текущем коде (Код #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]);
__________________
Hell is the possibility of sanity

Старый 08.07.2009, 15:06
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Класс Timer не динамический, поэтому "расширять" экземпляры нельзя. Вообще "расширять экземпляры" и "не устраивает тот факт.." это с ног на головы, должно быть как раз наоборот.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 08.07.2009, 15:08
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 9  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от vvvvvvf Посмотреть сообщение
можете дать пример где не надо создавать отдельный класс, а прямо в текущем коде расширить экземпляр экземпляр myTimer[i]
Это были люди большого богатства. Но они хотели странного. (с) АБС
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 08.07.2009, 15:11
vvvvvvf вне форума Посмотреть профиль Отправить личное сообщение для vvvvvvf Найти все сообщения от vvvvvvf
  № 10  
Ответить с цитированием
vvvvvvf
[+1 08.07.09]

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

Например в таком коде:
Код 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, время: 20:29.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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