![]() |
|
||||||||||
|
|||||
|
Регистрация: Aug 2004
Сообщений: 83
|
Всем привет. Помогите, плз, разобраться в одном примере. Здесь приведен упрощенный код, который содержит основные части для постановки данной задачки.
В конструкторе класса принимается ссылка на внешний мувик и ей приравнивается одна из переменных класа, которая становится постоянной ссылкой на внешний мувик. Через нее к внешнему мувику подсоединяется еще один пустой мувик, в котором должно строиться текстовое поле. В методе класса создается "на лету" текстовое поле, причем идентификатор текстового поля тоже устанавливается динамически (такое условие). Дальше необходимо полученный идентификатор поместить в массив, а потом через массив обратиться к свойствам текстового поля. К примеру, загрузить в него текст. Ниже приведен код класса, который в отдельном файле, еще ниже - код в тестовом флеш-файле. К топику прилагается пример во вложеном файле. Проблема возможно возникает где-то на этапе занесения идентификатора в массив, так как проверка значения массива показывает что там ничего нет. Где здесь ошибка? ------- testclass.as ---------------------------- class testclass { private var Arr:Array; private var ExtCanvas:MovieClip; public function testclass(place:MovieClip) { ExtCanvas = place; ExtCanvas.createEmptyMovieClip("Canvas",place.getNextHighestDepth()); } public function showtext() { var j:Number = 1; ExtCanvas.Canvas.createTextField("TextBlock"+j,ExtCanvas.Canvas.getNextHighestDepth(),0,0,300,30); Arr[j] = eval("ExtCanvas.Canvas.TextBlock"+j); Arr[j].type = "dynamic"; Arr[j].multiline = true; Arr[j].text = "npeBeg, kpacaB4er !!!"; trace(Arr[j].text); } } ----------------------------------- ----- zadachka.fla, первый кадр --- import testclass; tf = new testclass(muvik); tf.showtext(); ----------------------------------- здесь muvik - идентификатор мувиклипа (см. исходник). |
|
|||||
|
попробуй так:
файл testclass.as class testclass {
private static var cnt:Number = 0;
private var Arr:Array;
private var MovieName:String;
function testclass(myname:String, mytext:String, Xcor:Number, Ycor:Number) {
Arr = new Array();
MovieName = myname;
_level0.createEmptyMovieClip(MovieName, _level0.getNextHighestDepth());
_level0[MovieName].createTextField("TextBlock"+cnt,_level0[MovieName].getNextHighestDepth(),0,0,300,30);
with(_level0[MovieName]["TextBlock"+cnt]) {
_x = Xcor;
_y = Ycor;
type = "dynamic";
multiline = true;
text = mytext;
}
cnt++;
}
}
файл zadachka.fla |
|
|||||
|
Регистрация: Aug 2004
Сообщений: 83
|
Использование _level0 приведет к тому, что текстовое поле создается в мувике, который жестко привязан к нулевому уровню, т.е. к главному таймлайну. А нужно чтобы мувик этот прицеплялся к мувиклипу (или уровню) указанному в параметрах, передаваемым в конструктор, т.е. любому.
|
|
|||||
|
Регистрация: Aug 2004
Сообщений: 83
|
ExtCanvas = place;
ExtCanvas.createEmptyMovieClip("Canvas",place.getNextHighestDepth()); ExtCanvas принимает значение ссылки на внешний мувик, который может находиться где угодно, на любом уровне иерархии. В этой строке цепляется мувик для создания на нем множества текстовых полей. Почему не к внешнему ролику непосредственно? Для того чтобы не смешивать то что создается в этом классе с тем что имеется или будет создаваться другими классами/скриптами/функциями во внешнем мувике. Т.е. для текстовых полей, что создаются в этом классе есть своя территория. ExtCanvas.Canvas.createTextField("TextBlock"+j,ExtCanvas.Canvas.getNextHighestDepth(),... эта строка демонстрирует эту концепцию, т.е. создание текстовых полей на личной территории. Arr[j] = eval("ExtCanvas.Canvas.TextBlock"+j); Вот здесь непонятка. С функцией eval. Может я ее неправильно понимаю и соотв. применяю? Массив здесь нужен полюбому, так задумано. Т.е. получается массив текстовых полей. Ошибка кроется по-видимому где-то в этих приведенных четырех строчках. Последний раз редактировалось Danilishin; 23.03.2006 в 16:43. Причина: надо добавить еще одну строку кода |
|
|||||
|
Регистрация: Aug 2005
Сообщений: 83
|
class testclass {
private var Arr:Array = [];
private var ExtCanvas:MovieClip;
public function testclass(place:MovieClip) {
this.ExtCanvas = place;
this.ExtCanvas.createEmptyMovieClip("Canvas", this.ExtCanvas.getNextHighestDepth());
}
public function showtext() {
if (ExtCanvas.Canvas["TextBlock"+Arr.length] == undefined) {
ExtCanvas.Canvas.createTextField("TextBlock"+Arr.length, ExtCanvas.Canvas.getNextHighestDepth(), 0, 0, 300, 30);
}
var txtBlock:TextField = ExtCanvas.Canvas["TextBlock"+Arr.length];
txtBlock.type = "dynamic";
txtBlock.multiline = true;
txtBlock.text = "npeBeg, kpacaB4er !!!";
Arr.push(txtBlock);
//
trace(txtBlock.text);
}
}
|
|
|||||
|
Регистрация: Aug 2004
Сообщений: 83
|
Спасибо! Идею понял, этот вариант работает, но он мне подсказал еще лучшее решение для моего класса, позволяющее совсем отказаться от массива и упростить код. Просмотрел класс (не этот что в топике, а рабочий, полная версия), действительно это может значительно упростить весь код (а кода там достаточно много).
![]() Весь прикол в том, что ранее я не догадался использовать конструкцию: Мувик1.Мувик2["Название_элемента"] // ---------------- public function showtext() { var j:Number = 1; ExtCanvas.Canvas.createTextField("TextBlock"+j,ExtCanvas.Canvas.getNextHighestDepth(),0,0,300,30); ExtCanvas.Canvas["TextBlock"+j].type = "dynamic";; ExtCanvas.Canvas["TextBlock"+j].multiline = true; ExtCanvas.Canvas["TextBlock"+j].text = "npeBeg, kpacaB4er !!!"; } Всем спасибо! ![]() |
|
|||||
|
Регистрация: Aug 2005
Сообщений: 83
|
а ты гдето уже опередил j элемент массива ? обращаться к несуществуемому элеменету как минимум не корректно
удачи |
|
|||||
|
Регистрация: Aug 2004
Сообщений: 83
|
да, с этим все ок
Последний раз редактировалось Danilishin; 23.03.2006 в 19:20. |
|
|||||
|
Регистрация: Aug 2005
Сообщений: 83
|
я не о том
я просто предпологаю что ты создаешь Н текстовых полей, и для себя любомого складываешь их в массив, что у тебя было в первоночальном коде, ты просто говорил arr[j]=чемуто там, а масив перед этим был у тебя пустой, это не правильно и писать так не следует и вот мне почемуто показалось что ты чтото подобное написал гдето выше, вот решил предупредить ![]() |
|
|||||
|
Регистрация: Aug 2004
Сообщений: 83
|
Цитата:
var Arr:Array = new Array(); В рабочей версии там все нормально ![]() Спасибо за замечание. |
![]() |
![]() |
Часовой пояс GMT +4, время: 23:12. |
|
|
« Предыдущая тема | Следующая тема » |
|
|