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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.04.2008, 04:31
Stop Black PR! вне форума Посмотреть профиль Отправить личное сообщение для Stop Black PR! Посетить домашнюю страницу Stop Black PR! Найти все сообщения от Stop Black PR!
  № 1  
Ответить с цитированием
Stop Black PR!
 
Аватар для Stop Black PR!

Регистрация: Aug 2003
Адрес: Moscow
Сообщений: 113
Отправить сообщение для Stop Black PR! с помощью ICQ
По умолчанию Переданный в объект числовой параметр не хочет быть индексом массива

Есть класс с меню, в котором генерятся меню айтемы, каждый айтем - объект, получает в качестве параметра номер и ссылку на родитель (мувик-класс меню). Возникает странная вещь: переданный параметр-номер успешно выводится на экран, правильно смещает айтем, но отказывается быть индексом массива. Ошибка при выполнении:

Код:
TypeError: Error #1010: A term is undefined and has no properties.
	at MenuItem$iinit()[E:\projects\as3\Classes\MenuItem.as:21]
	at MainMenu$iinit()[E:\projects\as3\Classes\MainMenu.as:19]
	at App/initForms()[E:\projects\as3\Classes\App.as:28]
	at App$iinit()[E:\projects\as3\Classes\App.as:24]

Эксперименты показали, что если при инициализации объекта MenuItem вместо переменной подсунуть число, то всё удачно проходит.

Массив задаётся в классе Model:

Код:
data = new Object();
			data.cat = new Array();
			var i:uint;
			for (i=1; i<7;i++) {
				data.cat[i] = new Object();
				data.cat[i].name = "Меню"+i;
			}
MainMenu.as
Код:
package {
	import App;
	import Model;
	import MenuItem;
	import flash.display.Sprite;
	public class MainMenu extends Sprite{
		public var itemArr,myCat:Array;
		public static  var myParent:App;
		public var i:uint;
		public function MainMenu(parent:App) {
			myParent = parent;
			myCat = myParent.myModel.data.cat;
			y=100;
			x=30;
			
			itemArr = new Array();
			for (i=1; i<=myCat.length; i++) {
				//itemArr[i] = new MenuItem(this,2); - так работает
				itemArr[i] = new MenuItem(this,i);
				addChild(itemArr[i]); 
			}
			
		}
	}
}

MenuItem.as
Код:
package {
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.display.SimpleButton;
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.text.TextField; 
	import Model;
	import Controller;
	import MainMenu;
	public class MenuItem extends Sprite {
		//-------------------------
		public var myNum:uint;
		public var myParent:MainMenu;
		public var myCat:Array;
		//-------------------------
		public function MenuItem(parent:MainMenu,num:uint) {
			myParent = parent;
			myCat =  parent.myCat;
			myNum = num;
			txt.text = myCat[myNum].name; // а в качестве индекса в массиве не пашет!!!
			//txt.text = myCat[int(myNum)].name; - это тоже не работает
			//txt.text = "тебю "+myNum; - это тоже работает, номер верно выводится
			x = (myNum-1)*(width+5); // этот же номер успешно меняет координаты
		}
	}
}

Старый 29.04.2008, 09:56
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Ну правильно, на момент выполнения конструктора MenuItem у него ещё нет parent. Почему нельзя сразу передать нужный объект со свойствами, вместо индексов?
И вообще, делать все переменные публичными, заводить какие-то странные «myParent», «myNum» выглядит странно.

Старый 29.04.2008, 12:09
ulik вне форума Посмотреть профиль Отправить личное сообщение для ulik Посетить домашнюю страницу ulik Найти все сообщения от ulik
  № 3  
Ответить с цитированием
ulik
 
Аватар для ulik

Регистрация: Apr 2007
Адрес: Moscow city
Сообщений: 286
Отправить сообщение для ulik с помощью ICQ
Цитата:
data = new Object();
data.cat = new Array();
var i:uint;
for (i=1; i<7;i++) {
data.cat[i] = new Object();
data.cat[i].name = "Меню"+i;
}
Ну, вообще говоря, если вы хотите делать data.cat[i], то нужно тогда и new Array(n) сделать... "Чтобы что-нибудь взять, надо что-нибдь создать".
А если уж new Array();, то тогда push. Ну, это я так... К слову.
А еще странно, что у вас MainMenu в конструкторе все делает. Вот это станно. Ну, собственно, поэтому и не работает
__________________
Дизайн, как презерватив - каждому жмет по-своему © Я
мое: блог форум

Старый 29.04.2008, 13:26
Stop Black PR! вне форума Посмотреть профиль Отправить личное сообщение для Stop Black PR! Посетить домашнюю страницу Stop Black PR! Найти все сообщения от Stop Black PR!
  № 4  
Ответить с цитированием
Stop Black PR!
 
Аватар для Stop Black PR!

Регистрация: Aug 2003
Адрес: Moscow
Сообщений: 113
Отправить сообщение для Stop Black PR! с помощью ICQ
Цитата:
Сообщение от __etc Посмотреть сообщение
Почему нельзя сразу передать нужный объект со свойствами, вместо индексов?
И вообще, делать все переменные публичными, заводить какие-то странные «myParent», «myNum» выглядит странно.
1. Не ругайтесь строго, все переменные публичные, потому что это отладка и мой первый опыт с ас3 до этого писал на ас2. Когда нормально заработает буду менять свойства доступа.

2. Индекс используется чтобы сказать айтему какой у него номер. Вы бы как это сделали в данном случае? Я передаю ему номер в конструкторе, а потом запоминаю в свойстве, по моему это как раз логично.

3. myParent нужен чтобы запомнить родителя и обращаться к нему из других методов этого класса, если такая необходимость возникает (а она возникает часто, если не в меню то в другом месте обязательно это конструкция применится).

4. __etc, Из вашего совета я смог понять что в конструкторе есть смысл оставить только инициализацию свойств, а обращение к паренту делать в другом методе, так?

Но дело в том, что если в конструктор передать не переменную цикла, а простое число (я в коментарии к коду MainMenu.as указал), то код работает, т.е. парент на момент выполнения существует и мне удается получить значение массива.

Старый 29.04.2008, 13:47
Stop Black PR! вне форума Посмотреть профиль Отправить личное сообщение для Stop Black PR! Посетить домашнюю страницу Stop Black PR! Найти все сообщения от Stop Black PR!
  № 5  
Ответить с цитированием
Stop Black PR!
 
Аватар для Stop Black PR!

Регистрация: Aug 2003
Адрес: Moscow
Сообщений: 113
Отправить сообщение для Stop Black PR! с помощью ICQ
Перенёс заполнение имен в другой метод и вызвал его через интервал в 2 секунды.
Получил:

Код:
package {
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.display.SimpleButton;
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.*;

	import Model;
	import Controller;
	import MainMenu;
	public class MenuItem extends Sprite {
		//-------------------------
		public var myNum:uint;
		public var myParent:MainMenu;
		public var myCat:Array;
		//-------------------------
		public function MenuItem(parent:MainMenu,num:uint) {
			myParent = parent;
			myNum = num;
			x = (myNum-1)*(width+5);// этот же номер успешно меняет координаты
			var intervalId:uint = setTimeout(init, 2000);
		}
		public function init() {
			txt.text = myParent.myCat[myNum].name;
		}
	}
}
Через 2 с получаю ошибку выполнения

Код:
TypeError: Error #1010: A term is undefined and has no properties.
	at MenuItem/init()[E:\projects\as3\Classes\MenuItem.as:26]
	at Function/http://adobe.com/AS3/2006/builtin::apply()
	at ()
	at flash.utils::SetIntervalTimer/flash.utils:SetIntervalTimer::onTimer()
	at flash.utils::Timer/flash.utils:Timer::_timerDispatch()
	at flash.utils::Timer/flash.utils:Timer::tick()
Жму "продолжить"
и все менюшки заполняются нужными именами из массива

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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