IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

swfloader & FlexGlobals.topLevelApplication [Flex4]


Sujet :

Flex

  1. #1
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut swfloader & FlexGlobals.topLevelApplication
    Bonjour @ tous,

    J'ai un swf qui fonctionne très bien tout seul dans son coin. Ce swf a plusieurs classes, dans l'une d'entre elle j'ai été contraint d'utiliser FlexGlobals.topLevelApplication pour vérifier des variables mais aussi pour modifier une autre classe.
    L'ensemble, bien que pas très très propre fonctionne parfaitement.


    Aujourd'hui, ce swf est loader (swfloader) dans une appli plus grosse et du coup lorsque je fais appel FlexGlobals.topLevelApplication ca plante !!!

    Je ne sais pas du tout comment faire
    Merci de votre aide et de vos conseils

    Nicolas

  2. #2
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut
    Bonjour @ tous,

    Vraiment personne n'a une petite idée de comment je dois m'y prendre.
    Est'il de possible de cloissoner le swf loader de le faire fonctionner de façon autonome dans le swf principale ?
    Ou peut etre dois je modifier les appel par flexglobals mais en quoi.

    J'ai essayer d'utiliser la classe Global mais sans resultat.

    Merci de votre aide. Je suis bloqué !!

    Nicolas

  3. #3
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut
    J'ai peut etre trouvé un debut de solution mais j'ai un peu de mal à la mettre en place.

    Dans le swf loader, dans la class en question, je remplace les appels à flexGlobals.topLevelApplication.mavariable par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FlexGlobals.topLevelApplication.dispatchEvent(new Event("monEventPerso"));
    Jusque la cela fonctionne :

    Dans le fichier principale du swf loader, je met mon écouteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FlexGlobals.topLevelApplication.addEventListener("monEventPerso",maFonctionPerso);
    Puis dans la fonction qui est bien appelé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function maFonctionPerso(evt:Event):void {
    	evt.target.maVariable=true;
    OU
           evt.currentTarget.maVariable=true
     
    }
    Les deux ne fonctionnent pas
    J'ai aussi essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var tmp:maClass = evt.target as maClass
    var tmp:maClass = evt.currentTarget as maClass
    puis
    tmp.maVariable qui est public
    Mais rien n'y fait

    J'ai besoin dans la fonction d'agir sur les variables et les événement de la classe

    Merci pat avance de votre aide
    Nicolas

  4. #4
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut
    Mon problème est-il insoluble ou ma description est à revoir ?

    Que puis-je faire pour que vous puissiez m'aider ?
    Encore merci de votre aide,
    Nicolas

  5. #5
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    En relisant ton code c'est normal ce qui t'arrive

    Concrètement, nommons ton swf à loader Fille et ton application qui la charge Mere.

    Si tu utilises ton swf Fille en "standalone", alors FlexGlobals.topLevelApplication vaudra la classe Application de ton swf Fille.
    Si tu loades Fille dans Mere ( ) alors FlexGlobals.topLevelApplication vaudra la classe Application de ton swf Mere.

    Donc dans le cas 2, evt.target vaudra normalement la classe Application de la Mere, pas de la Fille.

    Solution 1 : ne pas appeler evt.target mais la référence de ton swf Fille.
    Solution 2 : revoir ton code afin d'encapsuler les traitements Fille uniquement dans Fille. Là tu passes par Mere pour modifier Fille, c'est pas logique et imagine si un jour tu charges Mere dans GrandMere

  6. #6
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut
    tout d'abord merci de ton aide,

    Je vais essayer d’être plus clair. J'avais bien compris le coup mere-fille voir grand mère.

    En partant du principe que le swf fille est chargé dans le swf mère
    Dans le swf fille :

    J'ai la classe application mxml et as avec la com bdd
    mais j'ai aussi
    - une classe (de type surface de dessin) 1 seul instance
    - une classe de type sprite (environ 100 sprites instanciés)

    1/ J'ai besoin d'envoyer a partir de la classe sprite vers la classe application (celle de la fille) un avertissement (evenement) en réaction au fonctionnement relativement autonome du sprite.
    2/ J'ai aussi un boolean dans la classe application (fille) que j'ai besoin de tester dans la classe sprite
    C'est cela que je n'arrive pas a faire

    Espérant avoir été plus clair

    Merci de votre aide

  7. #7
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Salut,

    je t'ai fait un exemple pas très propre mais fonctionnel

    Classe Mere :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    			   xmlns:s="library://ns.adobe.com/flex/spark" 
    			   xmlns:mx="library://ns.adobe.com/flex/mx">
     
     
    	<s:SWFLoader source="@Embed(source='fille.swf')" />
     
     
    </s:Application>
    Classe Fille (du swf fille.swf) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    			   xmlns:s="library://ns.adobe.com/flex/spark" 
    			   xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="application1_creationCompleteHandler(event)"  xmlns:sprite="com.sprite.*">
     
    	<fx:Script>
    		<![CDATA[
    			import mx.events.FlexEvent;
     
    			import spark.components.Button;
     
     
    			protected function application1_creationCompleteHandler(event:FlexEvent):void
    			{
    				sim.b1.addEventListener("lanceAvertissement", onAvertissement);	
    				sim.b2.addEventListener("demandeBoolean", onDemandeBoolean);	
    			}
     
    			protected function onAvertissement(event:Event):void
    			{
    				trace("avertissement recu dans classe Fille");
    			}
     
    			protected function onDemandeBoolean(event:Event):void
    			{
    				trace("envoi d'un booléen aléatoire depuis la classe Application Fille vers le target de l'event");
     
    				// génération d'un booleen aléatoire...
    				var b:Boolean = Math.random() > 0.5 ? true : false;
     
    				Button(event.target).label = "test du boolean -> " + b.toString();
    			}
     
    		]]>
    	</fx:Script>
     
    	<s:layout>
    		<s:VerticalLayout />
    	</s:layout>
     
    	<sprite:SimulationSprite id="sim"/>	
     
    </s:Application>
    Classe SimulationSprite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    package com.sprite
    {
    	import flash.events.Event;
    	import flash.events.MouseEvent;
     
    	import spark.components.Button;
    	import spark.components.SkinnableContainer;
    	import spark.layouts.VerticalLayout;
     
    	public class SimulationSprite extends SkinnableContainer
    	{
    		public var b1:Button;
    		public var b2:Button;
     
    		public function SimulationSprite()
    		{
    			super();
    			init();
    		}
     
    		private function init():void
    		{
    			b1 = new Button();
    			b2 = new Button();
     
    			b1.label = "lance averto";
    			b2.label = "test booléen -> pas encore testé";
     
    			b1.addEventListener(MouseEvent.CLICK, onClick1);
    			b2.addEventListener(MouseEvent.CLICK, onClick2);
     
    			addElement(b1);
    			addElement(b2);
     
    			layout = new VerticalLayout();
    		}
     
    		protected function onClick1(event:MouseEvent):void
    		{
    			b1.dispatchEvent(new Event("lanceAvertissement"));
    		}
     
    		protected function onClick2(event:MouseEvent):void
    		{
    			b2.dispatchEvent(new Event("demandeBoolean"));
    		}
     
    	}
    }
    En standalone ou en embarqué dans Mere, le swf Fille réagit de la même façon

  8. #8
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut
    Bonjour et vraiment merci,

    Voila comment j'ai fait, cela ressemble beaucoup à ton code.

    Dans la classe sprite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.dispatchEvent(new Event("majXY",true,false));
    Dans la class application du swf fille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FlexGlobals.topLevelApplication.addEventListener("majXY",majXY);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function majXY(evt:Event):void {
    loc.X1 = evt.target.arrayOfLittleSquare[0].x;
    loc.Y1 = evt.target.arrayOfLittleSquare[0].y;
    }
    Mais aussi pour la variable
    Dans la classe sprite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.dispatchEvent(new Event("getSpriteEmplctDraw",true,false));
    Dans la class application du swf fille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FlexGlobals.topLevelApplication.addEventListener("getSpriteEmplctDraw",getSpriteEmplctDraw);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function getSpriteEmplctDraw(evt:Event):void {
    evt.target.spriteEmplctDraw = spriteEmplctDraw;
    }
    De cette façon je récupère dans la classe sprite le boolean qui conditionne certaines fonctions.

    Je n'ai pas encore tout re-coder dans mon swf fille, il est plutôt gros en termes de lignes de code

    Merci pour d’éventuelles commentaires et encore une fois merci de ton aide.

    Nicolas

  9. #9
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Salut,

    à vue de nez sans trop réfléchir, je pense que ton code marchera pas embarqué dans le SWF Mere.

    En effet, l'intérêt de mon code proposé et de s’astreindre de FlexGlobals.topLevelApplication qui changera de valeur si tu es en standalone ou en embarqué dans un autre SWF.

    A mon avis, il faut que tu cloisonnes chaque traitement concernant un SWF dans ce même SWF comme je t'ai proposé en exemple.

    Teste avec ton code mais je pense pas que cela marchera.

  10. #10
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut
    Si si
    toute les événements que j'ai modifié fonctionne quand le swf est loader.
    Je fais toutes les modification et je les teste au fur et a mesure en étant loader.

    Je pense que le dispatch event fonctionne car j'ai mis le bubble à true. En fait au lieu de cloisonner je part du plus haut.

    Nicolas

  11. #11
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Citation Envoyé par nma Voir le message
    Je pense que le dispatch event fonctionne car j'ai mis le bubble à true. En fait au lieu de cloisonner je part du plus haut.
    C'est en général ce qu'il faut éviter pour soucis de maintenabilité etc...

    Là à ce que j'ai compris, tu fais intervenir la classe Mere dans des traitements uniquement destinés à la classe Fille ce qui n'est pas très logique.

    Mais si ça marche et que cela te convient tant mieux

  12. #12
    nma
    nma est déconnecté
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Par défaut
    Je suis assez d'accord avec toi mais pour tout faire propre je dois tout refaire et je manque de temps.

    Je crois avoir compris l'explication.

    En fait tous les dispatchevent en flexglobal.toplevelApplication fonctionne mais on ne peut pas récupérer l’émetteur seulement capter l’événement.

    Mais comme ma classe extend Sprite j'ai la possibilité d'utiliser bubbles à true qui me permet de faire remonter mon événement avec le bon émetteur.

    Je sais que je bidouille mais le temps .............

    Je referais tout cela plus tard, pour l'instant il faut que mon tout fonctionne fin de semaine.
    Après ce problème de sprite il me reste tous les tests, cela va être très short, vue qu'il y aura sans aucun doute des bugs.

    Mais en tout cas je te remercie. J'ai récupérer ton code pour plus tard (j’espère)

    Nicolas

  13. #13
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    L'important dans un premier temps est de bien comprendre le principe en effet

    Bon dév'

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo