![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Есть класс с меню, в котором генерятся меню айтемы, каждый айтем - объект, получает в качестве параметра номер и ссылку на родитель (мувик-класс меню). Возникает странная вещь: переданный параметр-номер успешно выводится на экран, правильно смещает айтем, но отказывается быть индексом массива. Ошибка при выполнении:
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;
}
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); // этот же номер успешно меняет координаты
}
}
}
__________________
Бесплатная Flash CMS Qubix с открытым кодом и индексацией в поисковиках. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Ну правильно, на момент выполнения конструктора MenuItem у него ещё нет parent. Почему нельзя сразу передать нужный объект со свойствами, вместо индексов?
И вообще, делать все переменные публичными, заводить какие-то странные «myParent», «myNum» выглядит странно. |
|
|||||
|
Цитата:
А если уж new Array();, то тогда push. Ну, это я так... К слову. А еще странно, что у вас MainMenu в конструкторе все делает. Вот это станно. Ну, собственно, поэтому и не работает ![]() |
|
|||||
|
Цитата:
2. Индекс используется чтобы сказать айтему какой у него номер. Вы бы как это сделали в данном случае? Я передаю ему номер в конструкторе, а потом запоминаю в свойстве, по моему это как раз логично. 3. myParent нужен чтобы запомнить родителя и обращаться к нему из других методов этого класса, если такая необходимость возникает (а она возникает часто, если не в меню то в другом месте обязательно это конструкция применится). 4. __etc, Из вашего совета я смог понять что в конструкторе есть смысл оставить только инициализацию свойств, а обращение к паренту делать в другом методе, так? Но дело в том, что если в конструктор передать не переменную цикла, а простое число (я в коментарии к коду MainMenu.as указал), то код работает, т.е. парент на момент выполнения существует и мне удается получить значение массива.
__________________
Бесплатная Flash CMS Qubix с открытым кодом и индексацией в поисковиках. |
|
|||||
|
Перенёс заполнение имен в другой метод и вызвал его через интервал в 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;
}
}
}
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() и все менюшки заполняются нужными именами из массива
__________________
Бесплатная Flash CMS Qubix с открытым кодом и индексацией в поисковиках. |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:01. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|