Просмотр полной версии : Помогите разобраться в примере
Danilishin
23.03.2006, 12:54
Всем привет. Помогите, плз, разобраться в одном примере. Здесь приведен упрощенный код, который содержит основные части для постановки данной задачки.
В конструкторе класса принимается ссылка на внешний мувик и ей приравнивается одна из переменных класа, которая становится постоянной ссылкой на внешний мувик. Через нее к внешнему мувику подсоединяется еще один пустой мувик, в котором должно строиться текстовое поле.
В методе класса создается "на лету" текстовое поле, причем идентификатор текстового поля тоже устанавливается динамически (такое условие). Дальше необходимо полученный идентификатор поместить в массив, а потом через массив обратиться к свойствам текстового поля. К примеру, загрузить в него текст.
Ниже приведен код класса, который в отдельном файле, еще ниже - код в тестовом флеш-файле. К топику прилагается пример во вложеном файле.
Проблема возможно возникает где-то на этапе занесения идентификатора в массив, так как проверка значения массива показывает что там ничего нет.
Где здесь ошибка?
------- 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 - идентификатор мувиклипа (см. исходник).
Juice_Green
23.03.2006, 15:03
попробуй так:
файл 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
import testclass;
var tf:testclass = new testclass(muvik, "123", 0, 0);
var tf1:testclass = new testclass(muvik1, "456", 300, 300);
Danilishin
23.03.2006, 16:26
Использование _level0 приведет к тому, что текстовое поле создается в мувике, который жестко привязан к нулевому уровню, т.е. к главному таймлайну. А нужно чтобы мувик этот прицеплялся к мувиклипу (или уровню) указанному в параметрах, передаваемым в конструктор, т.е. любому.
Danilishin
23.03.2006, 16:40
ExtCanvas = place;
ExtCanvas.createEmptyMovieClip("Canvas",place.getNextHighestDepth());
ExtCanvas принимает значение ссылки на внешний мувик, который может находиться где угодно, на любом уровне иерархии. В этой строке цепляется мувик для создания на нем множества текстовых полей. Почему не к внешнему ролику непосредственно? Для того чтобы не смешивать то что создается в этом классе с тем что имеется или будет создаваться другими классами/скриптами/функциями во внешнем мувике. Т.е. для текстовых полей, что создаются в этом классе есть своя территория.
ExtCanvas.Canvas.createTextField("TextBlock"+j,ExtCanvas.Canvas.getNextHighestDepth(),...
эта строка демонстрирует эту концепцию, т.е. создание текстовых полей на личной территории.
Arr[j] = eval("ExtCanvas.Canvas.TextBlock"+j);
Вот здесь непонятка. С функцией eval. Может я ее неправильно понимаю и соотв. применяю? Массив здесь нужен полюбому, так задумано. Т.е. получается массив текстовых полей.
Ошибка кроется по-видимому где-то в этих приведенных четырех строчках.
Andromed
23.03.2006, 18:10
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);
}
}
Danilishin
23.03.2006, 19:08
Спасибо! Идею понял, этот вариант работает, но он мне подсказал еще лучшее решение для моего класса, позволяющее совсем отказаться от массива и упростить код. Просмотрел класс (не этот что в топике, а рабочий, полная версия), действительно это может значительно упростить весь код (а кода там достаточно много). :)
Весь прикол в том, что ранее я не догадался использовать конструкцию:
Мувик1.Мувик2["Название_элемента"]
:rolleyes:
// ----------------
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 !!!";
}
Всем спасибо! :drinks:
Andromed
23.03.2006, 19:12
а ты гдето уже опередил j элемент массива ? обращаться к несуществуемому элеменету как минимум не корректно
удачи
Danilishin
23.03.2006, 19:14
да, с этим все ок
Andromed
23.03.2006, 19:23
я не о том :) я просто предпологаю что ты создаешь Н текстовых полей, и для себя любомого складываешь их в массив, что у тебя было в первоночальном коде,
ты просто говорил arr[j]=чемуто там, а масив перед этим был у тебя пустой, это не правильно и писать так не следует :) и вот мне почемуто показалось что ты чтото подобное написал гдето выше, вот решил предупредить :)
Danilishin
23.03.2006, 19:34
ты просто говорил arr[j]=чемуто там, а масив перед этим был у тебя пустой, это не правильно и писать так не следует :)
а, понял, я просто когда писал топик, в спешке неправильно написал объявление массива. Следует писать так:
var Arr:Array = new Array();
В рабочей версии там все нормально :)
Спасибо за замечание.
Andromed
23.03.2006, 19:42
var Arr:Array = []; можно и так не суть важно , у тебя длина массива попрежнему была ровна 0, а ты уже обращаешься к j элементу как будто он уже сто лет там был, еслиб ты написал так
var Arr:Array = [new TextField(..........)];
то мог бы обращаться к 0 элементу массива... :)
Danilishin
23.03.2006, 19:56
в данном топике я не использовал 0-й элемент массива :)
а 1 -да:
Arr[j] = eval("ExtCanvas.Canvas.TextBlock"+j);
где j = 1;
т.е. первый элемент получал значение ссылки на текстблок
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.