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

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

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

Регистрация: May 2009
Сообщений: 34
По умолчанию Как вытащить XML из другого файла...?

Пробую научиться получать адреса файлов для загрузки в галерею из XML файла.
Написал тестовую программку, а она не работает.
Когда смотрю через trace то вижу, что класс Zagruzki_XML отрабатывает правильно,
а когда я его вызываю в корневом файле test_zgr_XML.fla то ничего не получается
хотя на переменную из класса Zagruzki_XML он не ругается и судя по всему он её видит.
Помогите разобраться.

Корневой файл :
Код AS3:
package
{
	import flash.display.*;
	import flash.net.*;
	import flash.events.*;
 
	public class Test_zgr_XML extends Sprite
	{		
		var adres_fayla:String = new String;
 
		var kilkist:Zagruzki_XML;
 
		public function Test_zgr_XML()
		{			
		    kilkist = new Zagruzki_XML(this); 
			trace("adres_fayla =", adres_fayla);     // проверяю чистая ли переменная (P.S. естественно чистая)
			adres_fayla = kilkist.adresa[0];         // загружаю в перемннную строку из XML документа прочитанного классом Zagruzki_XML
			trace("adres_fayla =", adres_fayla);     // проверяю что теперь в переменной (P.S. увы null, хотя я надеялся увидить "img_test/1.swf" )
		}
	}	
}
класс Zagruzki_XML из одноимённого файла
Код AS3:
package
{ 
	import flash.display.*; 
	import flash.events.*; 
	import flash.net.*; 
 
		public class Zagruzki_XML extends Sprite 
		{ 			        					
			  var xml_Doc:XML;
			  var dokument_XML:URLLoader;									
			  var adresa:Array = new Array();
			  var itogo:int = new int;
			  var fayl_naznachenia:Test_zgr_XML;
 
			public function Zagruzki_XML(fayl_naznachenia:Test_zgr_XML)
			{
				this.fayl_naznachenia = fayl_naznachenia;					
				var zagruzka_iz_fayla:URLRequest = new URLRequest("test_fayl.xml");  
				dokument_XML = new URLLoader();                                  
				dokument_XML.addEventListener(Event.COMPLETE, full_Zavantagenia); 
				dokument_XML.load(zagruzka_iz_fayla);
			} 
			    private function full_Zavantagenia(event:Event)
			   { 
			    		xml_Doc = new XML(dokument_XML.data);
			    		for each (var schitat:XML in xml_Doc.*)             // считаю количество записей в XML документе
			                {
						adresa[itogo] = xml_Doc.img[itogo];	
						trace( "adressa[itogo] =", adresa[itogo]);   // показываю каждую запись
						itogo++;				
			                }							
						trace( "itogo =", itogo);		                  // показываю сколько записей в XML документе
					}
			} 
}
сам XML файл
Код:
<nabor>
          <img>"img_test/1.swf"</img>
          <img>"img_test/2.swf"</img>
          <img>"img_test/3.swf"</img>
          <img>"img_test/4.swf"</img>
</nabor>
исходники
Вложения
Тип файла: zip vopros.zip (6.9 Кб, 29 просмотров)


Последний раз редактировалось p0okm; 16.10.2009 в 17:36.
Старый 16.10.2009, 17:37
p0okm вне форума Посмотреть профиль Отправить личное сообщение для p0okm Найти все сообщения от p0okm
  № 2  
Ответить с цитированием
p0okm

Регистрация: May 2009
Сообщений: 34
Подскажите хоть в каком направлении искать!

Старый 16.10.2009, 17:47
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 3  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Читать про асинхронные события.
Вкратце - вы запускаете загрузку xml и рассчитываете тут же получить результат. А в нашей суровой реальности файл будет загружен гораздо позже, чем отработает блок кода, который вызывает load.
C данными можно будет работать после того, как наступит Event.COMPLETE
__________________
тонкий тролль, осеянный благодатью

Старый 16.10.2009, 17:53
Xpb7 вне форума Посмотреть профиль Отправить личное сообщение для Xpb7 Найти все сообщения от Xpb7
  № 4  
Ответить с цитированием
Xpb7

Регистрация: Jul 2008
Адрес: Рига
Сообщений: 176
Необходимо время, чтобы ваш XML загрузился, необходимо вешать листенер. Это можно было понять, даже посмотрев на output. Трэйсы класса Test_zgr_XML выведуться раньше, чем трэйсы Zagruzki_XML класса.

Зачем вы так извращаетесь с именами перменных и классов? Они же вам ничего плохого не сделали!

Старый 22.10.2009, 16:06
p0okm вне форума Посмотреть профиль Отправить личное сообщение для p0okm Найти все сообщения от p0okm
  № 5  
Ответить с цитированием
p0okm

Регистрация: May 2009
Сообщений: 34
Спасибо за подсказку, правда прогуглив всё что мог нашёл пару малоинформативных слов про "асинхронные операции" в Адобовском хелпе и практически всё.
Пробовал после
Код AS3:
kilkist = new Zagruzki_XML(this);
ставить цикл while ожидая выхода по завершению фактической загрузки, но тогда просто программка зависала.

Кстати
Код AS3:
dokument_XML.addEventListener(Event.COMPLETE, full_Zavantagenia);
присутствует в коде, или может его нужно слушать в вызывающем классе?

Старый 22.10.2009, 16:55
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 6  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Про ожидание циклом забудьте.

Код AS3:
dokument_XML.addEventListener(Event.COMPLETE, full_Zavantagenia);
Всё верно, данные становятся доступными, когда вызывается full_Zavantagenia. Соответственно из этой функции уже следует выполнять дальнейшие действия.

На самом деле нет никакого смысла писать отдельный класс для загрузки XML, для этого и был написан флэшовый URLLoader. Переносите код из Zagruzki_XML в главный класс, и будет вам счастье.
__________________
тонкий тролль, осеянный благодатью

Старый 24.10.2009, 04:48
p0okm вне форума Посмотреть профиль Отправить личное сообщение для p0okm Найти все сообщения от p0okm
  № 7  
Ответить с цитированием
p0okm

Регистрация: May 2009
Сообщений: 34
Продолжая попытки справится с этой загрузкой XML пришёл к такому вот варианту,
Тупо вставил таймер и после задержки получил ожидаемый результат:
Код AS3:
package
{
	import flash.display.*;
	import flash.net.*;
	import flash.events.*;
	import flash.utils.Timer;
 
	public class Test_zgr_XML extends Sprite
	{		
		var adres_fayla:String = new String;		
		var kilkist:Zagruzki_XML;		
		public function Test_zgr_XML()
		{			
		    kilkist = new Zagruzki_XML(this); 
		    var zadergka:Timer = new Timer(500, 1);
		    zadergka.addEventListener(TimerEvent.TIMER, timer_1); 
                    zadergka.start();
		}
		private function timer_1 (event:TimerEvent):void 
		{
			adres_fayla = kilkist.adresa[kilkist.itogo - 1];
			trace("adres_fayla =", adres_fayla);
		}
	}	
}
Естественно тут же захотелось увидеть как он реально загрузит картинки из указанных адресов. В функцию timer_1 дописал лоадер, а в самом конце ещё один тестовый трейсер:
Код AS3:
		private function timer_1 (event:TimerEvent):void 
		{
			adres_fayla = kilkist.adresa[kilkist.itogo - 1];
			trace("adres_fayla =", adres_fayla);
			var image:Loader = new Loader();		    
		        image.load( new URLRequest(adres_fayla));
			addChild(image);
                        trace("adres_fayla2 =", adres_fayla);
		}
В ответ получил , то есть финальный трейсер сработал раньше загрузки файла.
Код:
itogo = 3
adres_fayla = "img_test/tretiy.swf"
adres_fayla2 = "img_test/tretiy.swf"
Error #2044: Необработанный IOErrorEvent:. text=Error #2035: URL-адрес не обнаружен.
Тихо зверею, снова тупо вставляю тормоз в виде таймера
Код AS3:
package
{
	import flash.display.*;
	import flash.net.*;
	import flash.events.*;
	import flash.utils.Timer;
 
	public class Test_zgr_XML extends Sprite
	{		
		var adres_fayla:String = new String;
		var image:Loader = new Loader();
		var kilkist:Zagruzki_XML;
 
		public function Test_zgr_XML()
		{			
		    kilkist = new Zagruzki_XML(this); 
	            var zadergka:Timer = new Timer(500, 1);
		    zadergka.addEventListener(TimerEvent.TIMER, timer_1); 
                    zadergka.start();
		}
		private function timer_1 (event:TimerEvent):void 
		{
		    adres_fayla = kilkist.adresa[kilkist.itogo - 1];
	            trace("adres_fayla =", adres_fayla);					    
		    image.load( new URLRequest(adres_fayla));
		    var zadergka2:Timer = new Timer(500, 1);
		    zadergka2.addEventListener(TimerEvent.TIMER, timer_2); 
                    zadergka2.start();
		}
	        private function timer_2 (event:TimerEvent):void
	        {
		    addChild(image);
		    trace("adres_fayla2 =", adres_fayla);
		}
	}	
}
Получаю
Код:
itogo = 3
adres_fayla = "img_test/tretiy.swf"
Error #2044: Необработанный IOErrorEvent:. text=Error #2035: URL-адрес не обнаружен.
adres_fayla2 = "img_test/tretiy.swf"
Заменяю переменную с адресом из XML-файла adres_fayla = kilkist.adresa[kilkist.itogo - 1];
на adres_fayla = "img_test/tretiy.swf";
Всё работает даже без применения задержки.
Нитчего не понимаю
Почему так получается?

Добавлено через 12 часов 57 минут
С проблемой пути разобрался, в XML нужно было путь писать не в кавычках.
А вот как обойтись без искуственной задержки в виде TimerEvent.TIMER
пока не знаю.

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

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

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


 


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


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