PDA

Просмотр полной версии : Вызвать функцию из вложенной SWF. (я в отчаянии)


Xa13gi
07.03.2010, 21:58
Господа.. вот уже который день борюсь и никак не могу победить... весь инет облазил, везде по разному и везде не получается перекинуть решения на мою задачу...

Прошу Вашей помощи...

Ситуация (взял задачку для упрощения):

Есть SWF2

в ней есть функцию swf2_function():string
(которая возвращает некое значение)

Есть SWF1, в которую я загружаю SWF2 с помощью SWFLoader:
<mx:SWFLoader id="load1" loaderContext="{lc}"
source="dataload_test.swf" complete="loadcompl(event)" />

ну и соответственно в loadcompl(e:Event):void я хочу обращаться к функциям, переменным (разумеется они все public) загруженной SWF2.

loaderContext="{lc}"

это у меня :
[Bindable]
private var lc:LoaderContext;

и иницилизуруюсь в функции:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
backgroundColor="0xFFFFFF"
creationComplete="f_start_2();">
/*пропущено всякая фигня*/
private function f_start_2():void
{
lc = new LoaderContext();
lc.checkPolicyFile = false;
lc.applicationDomain = ApplicationDomain.currentDomain;
lc.securityDomain = null;
}

Сама флешка загружается успешно, так как если я при создании флешке SWF2 укажу запускать какую-либо функцию (c alert-ом к примеру), то при запуске SWF1 высветится Alert второй флешки. (но мне этого не надо).

Как всё-таки правильно обртатиться к параметрам и функциям загруженной SWF2??

что-то вроде swf2.application.swf2_function();

ну в данном случае наверно что-то вроде:

load1.content.swf2_function()



Flex + AS3 :)

Добавлено через 19 минут
на сколько я понимаю для вызова функций мне так же нужно использовать
public var loadedSM:SystemManager;

в функцию иницилизации SWF1 я вставляю:
loadedSM = SystemManager(load1.content);


и дальше по-идее могу обращаться через loadedSM к функциям SWF2 ... но нифига :( не получается:(

при попытке запустить с :
Local(loadedSM.application).f_start();
(как написанно в примере: http://wiki.flash-ripper.com/?title=SWFLoader)
он ругается: 1180: Call to a possibly undefined method Local.

Как правильно, чтобы он видел мои функции?

wvxvw
07.03.2010, 22:17
Ну так а кто ж знает где вы ее там во второй SWF объявили... И еще не понятно стремление пользоваться SWFLoader'ом - назначение и работа этого класса покрыта пеленой мрака и мракобесия - оно вам нужно? :)
А вообще - trace() и describeType() на что существуют? Потрейсте, что у вас в loader.content - я думаю, натолкнет на какие-то мысли.

Xa13gi
07.03.2010, 22:34
Спасибо, что заглянули сюда :) у меня теперь появляется надежда :)

по поводу трасировки: (как раз его и трасировал и натолкнул на SystemManager):
trace(load1.content); выдал:
"[object _SWF2_mx_managers_SystemManager]"

во второй флешке функцию, которую хочу вызвать, я определил как public.
или есть ещё какая-та специфика объявления в случае обращения извне к ней?


Просто с флексом и АС3 я только-только начинаю работать :(
мне он нужен для некоторых целей и смысл задач я сильно упростил для себя чтобы опробывать методы, которые мне потребуются...

ну т.е. в текущий момент я хочу реализовать такой механизм:
есть SWF1 она там что-то делает своё и каждые 10 секунд ей нужно обновить данные из XML и обработать эти данные (запустить функцию с распарсенными значениями). Чтобы не рефрешить SWF а просто обращаться к данным на другой ресурс, подумал что лучшего всего сделать вторую SWF которая будет собирать данные (HTTPService) и формировать XML.
_____

вот как раз и осталось мне организовать обращение из SWF1 в SWF2 за вызовом функции, которая вернёт XML. в данном лсучае всё упростил :)

Добавлено через 6 минут
вот код SWF2:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
backgroundColor="0xFFFFFF">
<mx:Script>
<![CDATA[

import mx.controls.Alert;

public function f_start():void
{
Alert.show(f_ret_val());
}

public function f_ret_val():String
{
var v_res:String = "Preved krasavcheg!"
return v_res;
}


]]>
</mx:Script>
</mx:Application>

собственно мне нужно вызвать f_ret_val() из SWF1...

а вот если я здесь укажу

creationComplete="f_start();"
то при загрузке SWF1 вылезет Alert. т.е. вроде как загрузилась SWF2 успешно...

wvxvw
08.03.2010, 02:59
object _SWF2_mx_managers_SystemManager - ну вот подумайте сами, вы создавали этот класс? Я так думаю, что нет, потому что это клон SystemManager'a а вы наверное свою функцию создали где-то в другом месте. Предположим, что вы ее создали в классе наследующемся от Application - вам нужно будет дождаться пока он загрузится (потому, что он во втором кадре), потом как-нибудь через, например, детей загруженного SystemManager'a найти ваш класс, или еще каким-нибудь способом - благо во фреймворке есть туча статических ссылок на разные его части. И только потом уже у него вызывать ваш метод.

neva
11.03.2010, 17:47
mc=MovieClip(swfLoader.content);
mc.someFunction();