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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.01.2012, 03:40
Yahen вне форума Посмотреть профиль Отправить личное сообщение для Yahen Посетить домашнюю страницу Yahen Найти все сообщения от Yahen
  № 1  
Ответить с цитированием
Yahen

Регистрация: Jan 2012
Сообщений: 35
По умолчанию getQualifiedClassName не отдает полное имя класса. Что делать?

Ситуация такова.
Есть некая загружаемая через loader swf с библиотекой внутри и пустой сценой. С ее помощью я создаю на сцене в основной флешке всякие разные спрайты. Вот таким образом это происходит:

Код AS3:
 a : Array = getDefinitionNames(DecorationLib.contentLoaderInfo);
...
 ClassReference:Class = DecorationLib.contentLoaderInfo.applicationDomain.getDefinition(a[index]) as Class;
...
 de : Sprite = new c();
addChild(de);
Пока все хорошо и замечательно. Все работает как нужно. Но вот наступает пора сохранить ( например в XML ) состояние сцены. Чтобы потом его продублировать в другом контейнере или восстановить в следующий раз. Казалось бы чего проще. Пробегаем по всем нужным объектам, собираем в кучку их имена через getQualifiedClassName, собираем так же нужные значения полей и все дела. Потом в нужный момент загружаем опять флешку с библиотекой. и пересоздаем заново все нужные объекты из сохраненного XML xml через getDefinitionByName. Все элементарно. Все красиво. В теории....
На практике же при попытке создать объект через getDefinitionByName используя в качестве параметра результат работы getQualifiedClassName для любого объекта созданого из загружаемой флешки не получается. Ловлю сообщение Variable <Имя класса как его дал getQualifiedClassName> is not defined.
не работают даже конструкция "В лоб" прямо на сцене.
Код AS3:
s = getQualifiedClassName(obj);
ClassReference = 	getDefinitionByName(s) as Class;
Разбор полетов через describeType привел к осознанию того, что getQualifiedClassName в данном случае возвращает короткое имя класса а не полное. для любого объекта, созданного не через загружаемую флешку возвращается полное имя и нет проблем создать другой такой же объект. А для загружаемых, только короткое имя.
Как говорится ну и овощ с ним. Я не гордый, могу к краткому имени и сам руками дописать недостающую часть. Только вот где ее взять то?

В принципе я знаю как обойти этот момент. Можно не использовать getDefinitionByName и каждый раз ходить через DecorationLib.contentLoaderInfo.applicationDomain.getDefinition Но тогда нужно дополнительно хранить информацию ( или хитро именовать классы) чтобы из имени класса точно знать, где в DecorationLib ходить, а где напрямую через getDefinitionByName создавать. А если загружаемых библиотек не одна, а несколько то уже как-то неудобно становится. Да и вообще непорядок на мой взгляд. Как это так что через getQualifiedClassName можно узнать имя не всякого класса?


Последний раз редактировалось Yahen; 20.01.2012 в 04:08.
Старый 20.01.2012, 10:01
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
если грузить либу в ApplicationDomain.currentDomain, то getDefinitionByName отдаст класс без проблем
если же в свой домен, то и получать надо через libDomain.getDefinition
в-общем не очень понятно в чем трабл

Старый 20.01.2012, 11:33
Yahen вне форума Посмотреть профиль Отправить личное сообщение для Yahen Посетить домашнюю страницу Yahen Найти все сообщения от Yahen
  № 3  
Ответить с цитированием
Yahen

Регистрация: Jan 2012
Сообщений: 35
Трабл в том, что
getQualifiedClassNamе ( для объектов построенных по defenition из загруженной либы) - возвращает кототкое имя а не длинное. И нет никакой возможности не обладая дополнительно сохраняемой информацией ( откуда был взят образец) создать еще один экземпляр класса, от значения getQualifiedClassNamе.

Старый 20.01.2012, 14:25
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
если грузить в ApplicationDomain.currentDomain, то дополнительная информация не нужна
Код AS3:
public function Main():void 
{
	var loader:Loader = new Loader();
	loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete);
	loader.load(new URLRequest("lib.swf"), new LoaderContext(false, ApplicationDomain.currentDomain));
}
 
private function loader_complete(e:Event):void 
{
	var loaderInfo:LoaderInfo = e.target as LoaderInfo;
	var arr:Array = getDefinitionNames(loaderInfo);
 
	var ref1:Class = loaderInfo.applicationDomain.getDefinition(arr[0]) as Class;
	var obj:Sprite = Sprite(new ref1());
	var className:String = getQualifiedClassName(obj);
 
	var ref2:Class = getDefinitionByName(className) as Class;
	addChild(new ref2());
 
}
или же, если загрузка в свой домен, то что мешает сохранить ссылку на loaderInfo.applicationDomain и получать класс через applicationDomain.getDefinition

Старый 20.01.2012, 14:43
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
А в либе как созданы классы с пакетом?

Старый 20.01.2012, 14:56
Yahen вне форума Посмотреть профиль Отправить личное сообщение для Yahen Посетить домашнюю страницу Yahen Найти все сообщения от Yahen
  № 6  
Ответить с цитированием
Yahen

Регистрация: Jan 2012
Сообщений: 35
Цитата:
Сообщение от silin Посмотреть сообщение
или же, если загрузка в свой домен, то что мешает сохранить ссылку на loaderInfo.applicationDomain и получать класс через applicationDomain.getDefinition
А мешает то, что таких флешек загружается несколько ( разные библиотеки) , и кроме них еще создаются объекты и из вшитых классов. Сответсвено по getQualifiedClassName не всегда можно однозначно определить откуда брать getDefinition.
Пока я решил вопрос путем указания хитрых имен классов в загружаемых либах. И на основе имени класса я определяю откуда брать getDefinition и брать ли вообще.
В принципе не страшно. Но сам факт, что getQualifiedClassName не дает всей информации для того, чтобы создать класс....

Старый 20.01.2012, 17:40
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
У всех getQualifiedClassName работает как надо, а у вас почему-то нет. Соберите пример, что ли.

Старый 20.01.2012, 22:48
Yahen вне форума Посмотреть профиль Отправить личное сообщение для Yahen Посетить домашнюю страницу Yahen Найти все сообщения от Yahen
  № 8  
Ответить с цитированием
Yahen

Регистрация: Jan 2012
Сообщений: 35
Пример я написал в самом первом сообщении.

Для встроенного объекта getQualifiedClassName отдает полный путь
Для загруженного объекта getQualifiedClassName отдает полный путь
Для объекта сделанного из образца загруженного через getDefinition отдает только имя класса.

Старый 20.01.2012, 22:56
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Цитата:
Сообщение от Yahen Посмотреть сообщение
отдает только имя класса.
Значит у него нет пакета вообще. Если у него есть пакет, но getQualifiedClassName возвращает только имя класса, тогда соберите простенький пример, описывающий такой баг.
Иначе это где-то ошибка в вашем коде.

Старый 21.01.2012, 00:00
Yahen вне форума Посмотреть профиль Отправить личное сообщение для Yahen Посетить домашнюю страницу Yahen Найти все сообщения от Yahen
  № 10  
Ответить с цитированием
Yahen

Регистрация: Jan 2012
Сообщений: 35
Я так понимаю, что пакета у него нет. У прототипа есть, а у него уже нет. Нет, как говорится и нет, не почему этот вопрос нигде в документации не поднимается?

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

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

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


 


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


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