2009-07-07 11 views
2

J'EMBEDDED un fichier swf dans mon applicationInteragir avec SWF Loader

<mx:SWFLoader source="@Embed(source='mod/VideoModule.swf')" width="50" height="50" id="loader" creationComplete="initLoader()" /> 

maintenant avec l'aide de la documentation flex je voulais interagir avec mon swf chargé en créant un SystemManager

[Bindable] 
    public var loadedSM:SystemManager; 

    private function initLoader() : void { 
     trace(loader.content); 
     loadedSM = SystemManager(loader.content); 
     var b: Button = loadedSM.application["button1"] as Button; 
     b.addEventListener(MouseEvent.CLICK, test); 
    } 

Mais au démarrage de l'application, l'erreur # 1034 se produit et indique que Main__embed_mxml_mod_VideoModule_swf_856293516 @ 33f53c1 n'a pas pu être converti en mx.managers.SystemManager

des idées?

merci à l'avance

Sebastian

Répondre

3

Alors tout d'abord j'utiliser l'événement complet de SWF chargeur annonce l'événement creationComplete se déclenche lorsque chargeur swf est créé, non pas avec son contenu chargé.

<mx:SWFLoader source="@Embed(source='mod/VideoModule.swf')" width="50" height="50" id="loader" complete="loaderCompleteHandler(event)" /> 

Ensuite, je passerais également l'argument FlexEvent lorsque l'événement se déclenche. Cet événement vous donne accès à l'instance de SWFLoader. SwfLoader a alors une propriété appelée contenu qui vous donnera accès au swf chargé. Si le swf expose ensuite une propriété nommée button1, vous pouvez faire quelque chose comme:

private function loaderCompleteHandler(event : FlexEvent) : void 
{ 
    var swfLaoder : SWFLoader = SWFLoader(event.target); 
    swfLaoder.content["button1"].addEventListener(MouseEvent.CLICK, test); 
} 
0

James a raison, même si cela pourrait être plus simple. Vous pouvez commencer par une déclaration similaire SWFLoader, en utilisant l'événement complet:

<mx:SWFLoader source="@Embed(source='mod/VideoModule.swf')" 
    width="50" 
    height="50" 
    id="loader" 
    complete="swfLoaded(event)" /> 

Ensuite, vous pouvez référencer l'objet chargeur directement dans votre gestionnaire (en supposant que le script est dans le même fichier MXML que la déclaration SWFLoader):

private function swfLoaded(event:Event):void 
{ 
    loader.content['button1'].addEventListener(MouseEvent.CLICK, test); 
} 

Ou si vous voulez utiliser les fonctionnalités de SystemManager, vous pouvez jeter le contenu à un SystemManager et aller de là:

var loadedSM:SystemManager; 
private function swfLoaded(event:Event):void 
{ 
    loadedSM = SystemManager(loader.content); 
    var b:Button = loadedSM.application["button1"] as Button; 
    b.addEventListener(MouseEvent.CLICK, test); 
} 

Bien sûr, vous prob Vous souhaitez également configurer des gestionnaires pour les événements ioError et securityError du SWFLoader, afin que les choses soient gérées avec élégance en cas de problème.

Questions connexes