Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Помогите разобраться в примере (http://www.flasher.ru/forum/showthread.php?t=77343)

Danilishin 23.03.2006 12:54

Помогите разобраться в примере
 
Вложений: 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 - идентификатор мувиклипа (см. исходник).

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

Цитата:

Сообщение от Andromed
ты просто говорил 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
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.