Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   передача данных через интерфейсы (http://www.flasher.ru/forum/showthread.php?t=193391)

Wadimir 26.01.2013 17:54

передача данных через интерфейсы
 
Добрый день!
Возник следующий вопрос. Нужно передать данные из основной 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;
        }
}


Wolsh 26.01.2013 20:02

Интересно, что Вы хотели сказать этой конструкцией
Код AS3:

                        //так ничего не передаёться
                        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

Цитата:

Сообщение от dimarik (Сообщение 1117940)
[i]
Добавлено через 4 минуты
Рассуждения о том, чтобы передать данные из одной swf в другую считаю дремучим невежеством.

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

и где были ваши умозаключения, dimarik, когда создавалась http://www.flasher.ru/forum/showthre...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

Цитата:

Сообщение от Wolsh (Сообщение 1117944)
А Вы не пробовали для начала потрейсить то, что написали?
Например, trace(this) Вас уже удивит, насколько я смог понять..
trace(ITextTrace(this))

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

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

Цитата:

Сообщение от Wolsh (Сообщение 1117944)
...то для начала надо наверное получить на нее ссылку

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

dimarik 26.01.2013 22:34

Цитата:

Сообщение от Wadimir (Сообщение 1117943)
Нормального ответа на свой вопрос я здесь не замечаю!!!

и где были ваши умозаключения, dimarik, когда создавалась http://www.flasher.ru/forum/showthre...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

Цитата:

Сообщение от dimarik (Сообщение 1117940)
Через Когда swf загрузилась в виртуальную машину, она перестала быть swf.

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

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

?

Wolsh 27.01.2013 15:41

Вам стоило начать с того, что определить разные реализации интерфейсного метода в разных классах. Чтобы они например не просто переданную параметром строку выводили, а добавляли свою отсебятину
Код AS3:

                public function textTrace(str:String):void {
                        trace("From DataExchange :", str);
                }

Код AS3:

                public function textTrace(str:String):void {
                        trace("From LoaderData :", str);
                }

Тогда Вам хотя бы будет понятно, кто трейсит..


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

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