Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.03.2006, 12:54
Danilishin вне форума Посмотреть профиль Найти все сообщения от Danilishin
  № 1  
Ответить с цитированием
Danilishin
 
Аватар для Danilishin

Регистрация: 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 - идентификатор мувиклипа (см. исходник).
Вложения
Тип файла: zip zadachka.zip (5.0 Кб, 10 просмотров)

Старый 23.03.2006, 15:03
Juice_Green вне форума Посмотреть профиль Отправить личное сообщение для Juice_Green Посетить домашнюю страницу Juice_Green Найти все сообщения от Juice_Green
  № 2  
Ответить с цитированием
Juice_Green
 
Аватар для Juice_Green

Регистрация: Dec 2005
Адрес: Новосибирск
Сообщений: 529
Отправить сообщение для Juice_Green с помощью ICQ Отправить сообщение для Juice_Green с помощью Skype™
попробуй так:

файл 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);

Старый 23.03.2006, 16:26
Danilishin вне форума Посмотреть профиль Найти все сообщения от Danilishin
  № 3  
Ответить с цитированием
Danilishin
 
Аватар для Danilishin

Регистрация: Aug 2004
Сообщений: 83
Использование _level0 приведет к тому, что текстовое поле создается в мувике, который жестко привязан к нулевому уровню, т.е. к главному таймлайну. А нужно чтобы мувик этот прицеплялся к мувиклипу (или уровню) указанному в параметрах, передаваемым в конструктор, т.е. любому.

Старый 23.03.2006, 16:40
Danilishin вне форума Посмотреть профиль Найти все сообщения от Danilishin
  № 4  
Ответить с цитированием
Danilishin
 
Аватар для Danilishin

Регистрация: 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. Причина: надо добавить еще одну строку кода
Старый 23.03.2006, 18:10
Andromed вне форума Посмотреть профиль Отправить личное сообщение для Andromed Найти все сообщения от Andromed
  № 5  
Ответить с цитированием
Andromed

Регистрация: 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);
	}
}

Старый 23.03.2006, 19:08
Danilishin вне форума Посмотреть профиль Найти все сообщения от Danilishin
  № 6  
Ответить с цитированием
Danilishin
 
Аватар для Danilishin

Регистрация: 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 !!!";
}

Всем спасибо!

Старый 23.03.2006, 19:12
Andromed вне форума Посмотреть профиль Отправить личное сообщение для Andromed Найти все сообщения от Andromed
  № 7  
Ответить с цитированием
Andromed

Регистрация: Aug 2005
Сообщений: 83
а ты гдето уже опередил j элемент массива ? обращаться к несуществуемому элеменету как минимум не корректно
удачи

Старый 23.03.2006, 19:14
Danilishin вне форума Посмотреть профиль Найти все сообщения от Danilishin
  № 8  
Ответить с цитированием
Danilishin
 
Аватар для Danilishin

Регистрация: Aug 2004
Сообщений: 83
да, с этим все ок


Последний раз редактировалось Danilishin; 23.03.2006 в 19:20.
Старый 23.03.2006, 19:23
Andromed вне форума Посмотреть профиль Отправить личное сообщение для Andromed Найти все сообщения от Andromed
  № 9  
Ответить с цитированием
Andromed

Регистрация: Aug 2005
Сообщений: 83
я не о том я просто предпологаю что ты создаешь Н текстовых полей, и для себя любомого складываешь их в массив, что у тебя было в первоночальном коде,
ты просто говорил arr[j]=чемуто там, а масив перед этим был у тебя пустой, это не правильно и писать так не следует и вот мне почемуто показалось что ты чтото подобное написал гдето выше, вот решил предупредить

Старый 23.03.2006, 19:34
Danilishin вне форума Посмотреть профиль Найти все сообщения от Danilishin
  № 10  
Ответить с цитированием
Danilishin
 
Аватар для Danilishin

Регистрация: Aug 2004
Сообщений: 83
Цитата:
Сообщение от Andromed
ты просто говорил arr[j]=чемуто там, а масив перед этим был у тебя пустой, это не правильно и писать так не следует
а, понял, я просто когда писал топик, в спешке неправильно написал объявление массива. Следует писать так:
var Arr:Array = new Array();

В рабочей версии там все нормально
Спасибо за замечание.

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:12.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.