![]() |
Помогите разобраться в примере
Вложений: 1
Всем привет. Помогите, плз, разобраться в одном примере. Здесь приведен упрощенный код, который содержит основные части для постановки данной задачки.
В конструкторе класса принимается ссылка на внешний мувик и ей приравнивается одна из переменных класа, которая становится постоянной ссылкой на внешний мувик. Через нее к внешнему мувику подсоединяется еще один пустой мувик, в котором должно строиться текстовое поле. В методе класса создается "на лету" текстовое поле, причем идентификатор текстового поля тоже устанавливается динамически (такое условие). Дальше необходимо полученный идентификатор поместить в массив, а потом через массив обратиться к свойствам текстового поля. К примеру, загрузить в него текст. Ниже приведен код класса, который в отдельном файле, еще ниже - код в тестовом флеш-файле. К топику прилагается пример во вложеном файле. Проблема возможно возникает где-то на этапе занесения идентификатора в массив, так как проверка значения массива показывает что там ничего нет. Где здесь ошибка? ------- 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 {файл zadachka.fla Код:
import testclass; |
Использование _level0 приведет к тому, что текстовое поле создается в мувике, который жестко привязан к нулевому уровню, т.е. к главному таймлайну. А нужно чтобы мувик этот прицеплялся к мувиклипу (или уровню) указанному в параметрах, передаваемым в конструктор, т.е. любому.
|
ExtCanvas = place;
ExtCanvas.createEmptyMovieClip("Canvas",place.getNextHighestDepth()); ExtCanvas принимает значение ссылки на внешний мувик, который может находиться где угодно, на любом уровне иерархии. В этой строке цепляется мувик для создания на нем множества текстовых полей. Почему не к внешнему ролику непосредственно? Для того чтобы не смешивать то что создается в этом классе с тем что имеется или будет создаваться другими классами/скриптами/функциями во внешнем мувике. Т.е. для текстовых полей, что создаются в этом классе есть своя территория. ExtCanvas.Canvas.createTextField("TextBlock"+j,ExtCanvas.Canvas.getNextHighestDepth(),... эта строка демонстрирует эту концепцию, т.е. создание текстовых полей на личной территории. Arr[j] = eval("ExtCanvas.Canvas.TextBlock"+j); Вот здесь непонятка. С функцией eval. Может я ее неправильно понимаю и соотв. применяю? Массив здесь нужен полюбому, так задумано. Т.е. получается массив текстовых полей. Ошибка кроется по-видимому где-то в этих приведенных четырех строчках. |
Код:
class testclass { |
Спасибо! Идею понял, этот вариант работает, но он мне подсказал еще лучшее решение для моего класса, позволяющее совсем отказаться от массива и упростить код. Просмотрел класс (не этот что в топике, а рабочий, полная версия), действительно это может значительно упростить весь код (а кода там достаточно много). :)
Весь прикол в том, что ранее я не догадался использовать конструкцию: Мувик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: |
а ты гдето уже опередил j элемент массива ? обращаться к несуществуемому элеменету как минимум не корректно
удачи |
да, с этим все ок
|
я не о том :) я просто предпологаю что ты создаешь Н текстовых полей, и для себя любомого складываешь их в массив, что у тебя было в первоночальном коде,
ты просто говорил arr[j]=чемуто там, а масив перед этим был у тебя пустой, это не правильно и писать так не следует :) и вот мне почемуто показалось что ты чтото подобное написал гдето выше, вот решил предупредить :) |
Цитата:
var Arr:Array = new Array(); В рабочей версии там все нормально :) Спасибо за замечание. |
| Часовой пояс GMT +4, время: 10:59. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.