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

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

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

Регистрация: Nov 2009
Сообщений: 176
По умолчанию передача данных через интерфейсы

Добрый день!
Возник следующий вопрос. Нужно передать данные из основной swf в подгружаемую и обратно через интерфейс. В подгружаемую получается передать через интерфейс, а вот в основную только через dispatchEvent.

Как через интерфейс передать данные в основную swf с подгружаемой? И возможно ли это?

Основная swf:
Код AS3:
package
{
	import flash.display.Loader;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.net.URLRequest;
	import flash.system.LoaderContext;
	import flash.system.Security;
	import flash.system.SecurityDomain;
 
	public class DataExchange extends Sprite implements ITextTrace
	{
		private var loader:Loader;
		private var loader2:Loader;
		private var mc:MovieClip;
		private var mc2:MovieClip;
 
		public var context:LoaderContext = new LoaderContext();
 
		public function DataExchange()
		{
			loadSWF();
		}
 
		private function loadSWF():void
		{
			var request:URLRequest = new URLRequest("res/field.swf"); 
			loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadCompleate);
			loader.load(request); 
		}
 
		private function onLoadCompleate(event:Event):void
		{
			var Field:Class = loader.contentLoaderInfo.applicationDomain.getDefinition('field') as Class;
 
			mc = new Field();
			mc.addEventListener(MouseEvent.CLICK, onClick);
			addChild(mc);
		}
 
		private function onClick(event:MouseEvent):void
		{
			if(Security.sandboxType == Security.REMOTE){
				context.securityDomain = SecurityDomain.currentDomain
			}
 
			var request:URLRequest = new URLRequest("res/LoaderData.swf"); 
			loader2 = new Loader();
			loader2.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadCompleate2);
			loader2.load(request); 	
		}
 
		private function onLoadCompleate2(event:Event):void
		{
			addChild(loader2);
			loader2.content.addEventListener("CLOSE", onExternalClick);
 
			//передаём из основной флешки в подгружаемую
			(loader2.content as ITextTrace).textTrace("from");
		}
 
		protected function onExternalClick(event:Event):void
		{
			textTrace("for");
		}
 
		public function textTrace(str:String):void {
			trace(str);
		}
	}
}
подгружаемая:
Код AS3:
package
{
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.system.LoaderContext;
	import flash.system.Security;
	import flash.system.SecurityDomain;
 
	public class LoaderData extends Sprite implements ITextTrace
	{
		[Embed('res/field2.swf', mimeType='application/octet-stream')]
		private var Field2:Class;
 
		private var loader:Loader;
		private var mc:MovieClip;
 
		public var context:LoaderContext = new LoaderContext();
 
		public function LoaderData()
		{
			Security.allowDomain("*");
			context.securityDomain = SecurityDomain.currentDomain
 
			loadSWF();
		}
		private function loadSWF():void
		{
			var swfClassField2:Class = Field2;
			var loaderField2:Loader = new Loader();
			loaderField2.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInitRoom);
			loaderField2.loadBytes(new swfClassField2);
		}
 
		private function onLoaderInitRoom(event:Event):void
		{
			var field2LI:LoaderInfo = LoaderInfo(event.currentTarget);
			field2LI.removeEventListener(Event.INIT, onLoaderInitRoom);
 
			var Field:Class = field2LI.applicationDomain.getDefinition('field2') as Class;
 
			mc = new Field();
 
			addChild(mc);
 
			mc.addEventListener(MouseEvent.CLICK, onClick);
 
		}
 
		private function onClick(event:MouseEvent):void
		{
			removeChild(mc);
 
			//передаём из подгружаемой в основную
			dispatchEvent(new Event("CLOSE"));
 
			//так ничего не передаёться
			ITextTrace(this).textTrace("for");
		}
 
		public function textTrace(str:String):void {
			trace(str);
		}
	}
}
интерфейсы:
Код AS3:
package
{
	public interface ITextTrace
	{
		function textTrace(str:String):void;
	}
}

Старый 26.01.2013, 20:02
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Интересно, что Вы хотели сказать этой конструкцией
Код AS3:
			//так ничего не передаёться
			ITextTrace(this).textTrace("for");
__________________
Reality.getBounds(this);

Старый 26.01.2013, 20:06
Wadimir вне форума Посмотреть профиль Отправить личное сообщение для Wadimir Найти все сообщения от Wadimir
  № 3  
Ответить с цитированием
Wadimir

Регистрация: Nov 2009
Сообщений: 176
как то хотел передать через интерфейс в основную swf.
в этом и вопрос. Как?


Последний раз редактировалось Wadimir; 26.01.2013 в 20:39.
Старый 26.01.2013, 21:06
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Через интерфейс, в его понимании как ООП инструмента, вы ничего не передадите. Другое дело электроника. Там все передается через интерфейсы.

Добавлено через 4 минуты
Я вам больше скажу. Когда swf загрузилась в виртуальную машину, она перестала быть swf. Рассуждения о том, чтобы передать данные из одной swf в другую считаю дремучим невежеством.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 26.01.2013, 21:17
Wadimir вне форума Посмотреть профиль Отправить личное сообщение для Wadimir Найти все сообщения от Wadimir
  № 5  
Ответить с цитированием
Wadimir

Регистрация: Nov 2009
Сообщений: 176
Цитата:
Сообщение от dimarik Посмотреть сообщение
[i]
Добавлено через 4 минуты
Рассуждения о том, чтобы передать данные из одной swf в другую считаю дремучим невежеством.
Нормального ответа на свой вопрос я здесь не замечаю!!!

и где были ваши умозаключения, dimarik, когда создавалась http://www.flasher.ru/forum/showthre...E0%ED%ED%FB%E5 эта тема и подобные?

Старый 26.01.2013, 21:22
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А Вы не пробовали для начала потрейсить то, что написали?
Например, trace(this) Вас уже удивит, насколько я смог понять..
trace(ITextTrace(this)) должен удивить не меньше.
Фактически, Вы написали что-то вроде DisplayObjectContainer(this).addChild(mc); вместо addChild(mc); как Вы пишете выше, не боясь что this окажется.. вовсе не this.
Короче я не понимаю ни логики ни вопроса. Ни самой фразы "передать через интерфейс", ни тем более самого кода (что и куда там передается? где там хотя бы упоминается "основная swf"? Вы пытаетесь вызвать в одном методе экземпляра другой, его же собственный, публичный метод, перед этим зачем-то проведя преобразование его же класса в интерфейс, как будто у класса без этого преобразования не будет нужного метода).
Если Вы хотите вызвать метод "основной swf", то для начала надо наверное получить на нее ссылку, затем осуществить кастинг (... as ...) или проверку (if (... is ...)), является ли класс "основной swf" имплементатором интерфейса ITextTrace, и если да, то вызвать предусмотренный интерфейсом метод.
__________________
Reality.getBounds(this);

Старый 26.01.2013, 21:39
Wadimir вне форума Посмотреть профиль Отправить личное сообщение для Wadimir Найти все сообщения от Wadimir
  № 7  
Ответить с цитированием
Wadimir

Регистрация: Nov 2009
Сообщений: 176
Цитата:
Сообщение от Wolsh Посмотреть сообщение
А Вы не пробовали для начала потрейсить то, что написали?
Например, trace(this) Вас уже удивит, насколько я смог понять..
trace(ITextTrace(this))
ITextTrace(this).textTrace("for"); в консоле будет for.

И почему вы вцепились к этой строчке, я и сам знаю что это не правильно.

Цитата:
Сообщение от Wolsh Посмотреть сообщение
...то для начала надо наверное получить на нее ссылку
точно, что то я затупил. Спасибо

Старый 26.01.2013, 22:34
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Wadimir Посмотреть сообщение
Нормального ответа на свой вопрос я здесь не замечаю!!!

и где были ваши умозаключения, dimarik, когда создавалась http://www.flasher.ru/forum/showthre...E0%ED%ED%FB%E5 эта тема и подобные?
А я за всеми темами не успеваю !!!

И не вам я эти умозаключения оставил, а интернетам.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 26.01.2013, 23:32
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
ITextTrace(this).textTrace("for"); в консоле будет for.
Более того,
this.textTrace("for"); "в консоле будет for",
textTrace("for"); "в консоле будет for",
и даже trace("for"); "в консоле будет for".
Цитата:
И почему вы вцепились к этой строчке
Потому что Вы создали эту тему. Она — об "этой строчке".
__________________
Reality.getBounds(this);

Старый 27.01.2013, 13:48
Wadimir вне форума Посмотреть профиль Отправить личное сообщение для Wadimir Найти все сообщения от Wadimir
  № 10  
Ответить с цитированием
Wadimir

Регистрация: Nov 2009
Сообщений: 176
Цитата:
Сообщение от dimarik Посмотреть сообщение
Через Когда swf загрузилась в виртуальную машину, она перестала быть swf.
а что тогда в консоле означает вот это:
Код AS3:
[Unload SWF] D:\AS\TestProject\interfaces\DataExchange\bin-debug\res\LoaderData.swf
?

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

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

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


 


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


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