PDA

Просмотр полной версии : передача данных через интерфейсы


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

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

Основная swf:

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);
}
}
}


подгружаемая:

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);
}
}
}


интерфейсы:

package
{
public interface ITextTrace
{
function textTrace(str:String):void;
}
}

Wolsh
26.01.2013, 20:02
Интересно, что Вы хотели сказать этой конструкцией
//так ничего не передаёться
ITextTrace(this).textTrace("for");

Wadimir
26.01.2013, 20:06
как то хотел передать через интерфейс в основную swf.
в этом и вопрос. Как?

dimarik
26.01.2013, 21:06
Через интерфейс, в его понимании как ООП инструмента, вы ничего не передадите. Другое дело электроника. Там все передается через интерфейсы.

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

Wadimir
26.01.2013, 21:17
[I]
Добавлено через 4 минуты
Рассуждения о том, чтобы передать данные из одной swf в другую считаю дремучим невежеством.

Нормального ответа на свой вопрос я здесь не замечаю!!!

и где были ваши умозаключения, dimarik, когда создавалась http://www.flasher.ru/forum/showthread.php?t=177923&highlight=%EF%E5%F0%E5%E4%E0%F2%FC+%E4%E0%ED%ED%FB%E5 эта тема и подобные?

Wolsh
26.01.2013, 21:22
А Вы не пробовали для начала потрейсить то, что написали?
Например, trace(this) Вас уже удивит, насколько я смог понять..
trace(ITextTrace(this)) должен удивить не меньше.
Фактически, Вы написали что-то вроде DisplayObjectContainer(this).addChild(mc); вместо addChild(mc); как Вы пишете выше, не боясь что this окажется.. вовсе не this.
Короче я не понимаю ни логики ни вопроса. Ни самой фразы "передать через интерфейс", ни тем более самого кода (что и куда там передается? где там хотя бы упоминается "основная swf"? Вы пытаетесь вызвать в одном методе экземпляра другой, его же собственный, публичный метод, перед этим зачем-то проведя преобразование его же класса в интерфейс, как будто у класса без этого преобразования не будет нужного метода).
Если Вы хотите вызвать метод "основной swf", то для начала надо наверное получить на нее ссылку, затем осуществить кастинг (... as ...) или проверку (if (... is ...)), является ли класс "основной swf" имплементатором интерфейса ITextTrace, и если да, то вызвать предусмотренный интерфейсом метод.

Wadimir
26.01.2013, 21:39
А Вы не пробовали для начала потрейсить то, что написали?
Например, trace(this) Вас уже удивит, насколько я смог понять..
trace(ITextTrace(this))

ITextTrace(this).textTrace("for"); в консоле будет for.

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

...то для начала надо наверное получить на нее ссылку

точно, что то я затупил. Спасибо

dimarik
26.01.2013, 22:34
Нормального ответа на свой вопрос я здесь не замечаю!!!

и где были ваши умозаключения, dimarik, когда создавалась http://www.flasher.ru/forum/showthread.php?t=177923&highlight=%EF%E5%F0%E5%E4%E0%F2%FC+%E4%E0%ED%ED%FB%E5 эта тема и подобные?

А я за всеми темами не успеваю !!!

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

Wolsh
26.01.2013, 23:32
ITextTrace(this).textTrace("for"); в консоле будет for.Более того,
this.textTrace("for"); "в консоле будет for",
textTrace("for"); "в консоле будет for",
и даже trace("for"); "в консоле будет for".
И почему вы вцепились к этой строчкеПотому что Вы создали эту тему. Она — об "этой строчке".

Wadimir
27.01.2013, 13:48
Через Когда swf загрузилась в виртуальную машину, она перестала быть swf.

а что тогда в консоле означает вот это:

[Unload SWF] D:\AS\TestProject\interfaces\DataExchange\bin-debug\res\LoaderData.swf

?

Wolsh
27.01.2013, 15:41
Вам стоило начать с того, что определить разные реализации интерфейсного метода в разных классах. Чтобы они например не просто переданную параметром строку выводили, а добавляли свою отсебятину
public function textTrace(str:String):void {
trace("From DataExchange :", str);
}
public function textTrace(str:String):void {
trace("From LoaderData :", str);
}
Тогда Вам хотя бы будет понятно, кто трейсит..