Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как подключить класс из swf на этапе выполнения? (http://www.flasher.ru/forum/showthread.php?t=212326)

AsCen Veddge 18.01.2016 22:56

Как подключить класс из swf на этапе выполнения?
 
При загрузке одного swf в другой (лоадер+апликэйшн домейн) его класс не определяется как класс на этапе компиляции. (Type was not found or was not a compile-time constant: Slut)
Код:

...
        ldr = new Loader();
        var req:URLRequest = new URLRequest("../bin/Slut.swf");
            var appDomainB:ApplicationDomain = ApplicationDomain.currentDomain;
        var ldrContext:LoaderContext = new LoaderContext(false, appDomainB);
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            ldr.load(req, ldrContext);
        }
                private function completeHandler(event:Event):void
        {
                var Sluts:Class = event.target.applicationDomain.getDefinition("Slut") as Class;
                var mySlut:Sluts = Sluts(event.target.content);

IDE:FD,
use network services: false,
фактически это пример использования метода из загруженного swf из документации adobe...
Вопрос: что не так с настройками FlashDevelop? Или нужно что-то прописать в Slut?

дополнение: остальные примеры с applicationDomain из документации также не работают (по другому - другие ошибки, но принцип тот же - не видит Slut как класс).

Добавлено через 30 часов 56 минут
итерационным методом был получен следующий результат:
Код:

      var mySlut:*= new Sluts();
тогда методы из загруженной swf Slut работают.
кроме того, в заголовке класса Slut установлено:
Код:

      /**
    * @mxmlc accessible=true
    *
    */

, но это, наверное, ни при чём, как и use network service.

in4core 21.01.2016 14:59

Код AS3:

public function addLibrary(loaderinfo:LoaderInfo):void 
                {
                        var info:ApplicationDomain = loaderinfo.applicationDomain;
                        var cls:Class = null;
 
 
                        cls = info.getDefinition("HUD3") as Class;
 
                        hud = new cls() as MovieClip;
 
                        history = info.getDefinition("HistorySymbol");
 
 
 
                        cls = info.getDefinition("GameGFX") as Class;
                        back = new cls() as MovieClip;

И т.п.

gloomyBrain 21.01.2016 16:36

Посмотрите вот эту тему: http://www.flasher.ru/forum/showthread.php?t=144282
Ну и почитайте про политики безопасности, все дело в них.

undefined 21.01.2016 16:41

Вложений: 1
Sluts :)

Rzer 23.01.2016 02:44

я всегда использую getDefinitionByName, попробуй с ним

AsCen Veddge 01.02.2016 17:39

Проблема была в том, что фд не принимал класс из загруженной свф-ки.
А сейчас он перестал понимать нормальный код и начал выдавать совершенно причудливые ошибки, при каждой попытке компиляции разные. Пришлось его снести. Поэтому текущий вопрос такой: как установить пятый Флешдевелоп в стэндалоне режиме? Не могли бы благородные доны и доньи подсказать толковые гайды и доки по настройке ФДшечки? Спасибо.
p.s.:класс слут был назван столь причудливо не только из фривольных соображений, но дабы обеспечить уникальность именования оного.

Rzer 01.02.2016 18:52

Если вопрос, про определение классов кодом, то нужно компилисть внешний проект в swf и swc. Далее подключать swc (Правой кнопкой > Add to library), а затем в настройках выбирать External Library (Правой кнопкой > опции). И грузить swf в текущий ApplicationDomain

AsCen Veddge 02.02.2016 10:06

Вопрос уже про настройку\переустановку Flashdevelop, потому что он уже находит ошибку в таком коде:
Код:

var timer:Timer;
timer:Timer = new Timer(1000,0);


caseyryan 02.02.2016 10:55

Вряд ли дело в FD. Скорее всего Flex / AIR sdk подключен не правильно
кстати система случайно не 8ка 64 битная?

Wolsh 02.02.2016 11:56

Цитата:

потому что он уже находит ошибку в таком коде:
И всегда находил. И будет находить после переустановки.

AsCen Veddge 03.02.2016 12:05

Всё верно, продолжил, надо было курить доки, но после переустановки по крайней мере одни и те же ошибки.
Со стэндалоне режимом разобрался - фд в нём надо запускать от имени администратора, библиотеки, есс-но, подключил нормально и дебажный плеер тоже. Джава 1.6 32б, да, но это так и было.

По теме.
Взял пример из документации адобе, ApplicationDomainExample
для того, чтобы он работал в заголовке надо прописать:
//@mxmlc -static-link-runtime-shared-libraries = true;
иначе не подгружает свф,
а в classLoadedHandler
Код:

var greeter:* = new runtimeClassRef();
гритер - класс из подгружаемый свф-ки и если его определить как runtimeClassRef, а не *, то компилятор говорит, мол, нет такого класса. ГетДифинишнБайНэйм я вообще не понял куда тут прикручивать.

Но вот так всё работает.

какую нибудь документацию по компилятору бы...

caseyryan 03.02.2016 13:13

Цитата:

Со стэндалоне режимом разобрался - фд в нём надо запускать от имени администратора, библиотеки, есс-но, подключил нормально и дебажный плеер тоже.
Совсем не обязательно. Это скорее ограничение винды. Чтобы писать данные в Program Files, нужны права администратора. FD можно установить не в Program Files, и права администратора не понадобятся
Цитата:

то компилятор говорит, мол, нет такого класса.
Значит его на самом деле нет. Если класс нигде не упомянут в проекте, то он не вкомпилируется. Это нормальное поведение компилятора.

Wolsh 03.02.2016 15:38

AsCen Veddge, определитесь пожалуйста с вопросом. Тема называется "как подключить класс на этапе выполнения", но Вы с самого начала постоянно пишете про ФД, компилятор и прочее, не имеющее ровным счетом никакого отношения к рантайму. И ответы получаете соответствующие.
При чем здесь, по-вашему, компилятор, доки по нему, настройки ФД, стендалон и прочие права администратора? Вы чего добиться то хотите? Чтобы компилятор как ни в чем ни бывало воспринимал в коде класс, которого НЕТ на этапе компиляции? Так этого не будет. Либо динамика и определение типов через звездочку, либо общий интерфейс, но в любом случае, если Вам нужно именно создавать новые экземпляры, то сохраняете ссылку от getDefinitionByName в переменную типа :Class и дальше через new. Но переменная для хранения экземпляра, конечно же, не может быть объявлена компилятору как класс, которого НЕТ. Этого Вы не получите никак.
Есть еще другой способ — завести в загружаемой swf метод, возвращающий экземпляр класса, который определен в этой swf. Но, опять же, загрузчик не будет "знать" тот класс, который в него не вкомпилирован, и для вызова методов и обращения к свойствам Вам придется опустить тип до Object или *. Если хочется красивого кода, то определите общий интерфейс — интерфейсы сравниваются по содержанию.

AsCen Veddge 06.02.2016 09:48

Понимаете, без строчки
Код:

//@mxmlc -static-link-runtime-shared-libraries = true;
в заголовке загрузчика
возникают следующие ошибки на этапе выполнения:

Error: Cannot load the specified file.
at ApplicationDomainExample/loadErrorHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at ClassLoader/ioErrorHandler()

, так что настройки компилятора тут очень даже при чём.
Однако вопрос загрузки одной свф-ки считаю решённым.

Следующий вопрос будет: как организовать архитектуру приложения с несколькими подгружаемыми файлами и сокетами.
есть немного теории здесь: https://habrahabr.ru/post/276593/
И есть несколько топиков здесь, на flasher.ru
например вот: http://www.flasher.ru/forum/showthread.php?t=144282

По идее надо создавать отдельный топик, но я ещё не пробовал это в коде, поэтому пока тут, ок?

Wolsh 06.02.2016 10:52

Вложений: 1
Простой пример без всяких перестроек.

alatar 07.02.2016 20:04

Цитата:

Сообщение от Wolsh (Сообщение 1191521)
Либо динамика и определение типов через звездочку, либо общий интерфейс...

Ну, строго говоря, можно и класс использовать. Только его придется скомпилировать в swc, которую подключить как "external", а после запуска грузить swf с этим классом в предыдущий кадр, перед тем как он будет использоваться.


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

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