Aide - Recherche - Membres - Calendrier
Version complète : Accès aux variables d'une classe supérieur
Centre de Formation Flash - Forums Adobe Flash > Rich media et intégration > Flex
VinceDDH
Bonjour, ce sujet rejoins celui que j'ai ouvert la semaine dernière, mais n'ayant pas eu de réponse je me suis penché sur un autre cas, avec plus ou moins le même problême...
je charge un fichier xml dans une class, une fois réalisé j'appelle une class qui devra (une fois terminé) me faire un menu déroulant (avec les données du xml) ....
Plutot que de redonner les élements à mon menuDeroulant, en redéclarant une variable, j'aimerais y accéder via un this.parent.nomDeMaVariable, mais j'ai un message d'erreur me disant que j'essaye d'accéder à une variable peut être non définie... (elle est définit comme ceci : public var nbNode:Number = new Number()wink.gif

MenuDeroulant.as
CODE
package _class {
    
    import mx.core.UIComponent;
    import mx.containers.Canvas;
    
    public class MenuDeroulant extends Canvas    {
        
        // ===============================================
        //                                              Elements                                                
        // ===============================================
        // test Fond
        private var fond:UIComponent = new UIComponent();
        // test parent
        private var _test:Object = new Object();
        
        public function MenuDeroulant():void {
            
            _test = this.parent;
            
            trace(_test.nbNode);
            
            fond.graphics.beginFill(0xCC0000, 1);
            fond.graphics.drawRect(1, 2, 220, 82);
            fond.graphics.endFill();
            
            fond.x = fond.y = 0;
            
            fond.buttonMode = true;
            
            this.addChild(fond);
            
        }
        
    }
    
}


Le test actuel n'essaye de récupérer le nombre de Noeud dans mon fichier, je voudrais au final pouvoir accéder à tout mon fichier....

Merci d'avance, en esperant avoir une solution !
Fusion
Essaie un
CODE
Alert.show(this.parent.toString());
et regarde ce que ça renvoie, ça te dira si tu atteins bien le parent déjà...
VinceDDH
J'ai déjà testé avec un trace, il me trouve bien le parent, donc pas de souci à ce niveau là, je pense que c'est plus par rapport à la déclaration de la variable... ou à la défintiion de ma class MenuDeroulant....
Fusion
Tu peux aussi utiliser la variable
CODE
this.parentApplication
même si c'est carrément bourrin, et encore pire tu peux utiliser mx.core.Application.application... dans un premier temps bien sûr icon_razz.gif .

Sinon ton code a l'air correct, mais ça m'intéresserait de voir comment tu appelles la classe menuDeroulant dans ton appli, c'est peut-être là que ça coince...

VinceDDH
hé bien tu réponds à ma question de mon précédent post icon_biggrin.gif, reste plus que la réponse à celui là icon_biggrin.gif, merci en tout cas !

ci joint le code du parent
CODE
package _class {
    
    import _class.MenuDeroulant;

    import mx.containers.Canvas;
    import mx.core.UIComponent;
    import mx.events.FlexEvent;
    import mx.controls.Label;
    import mx.controls.Image;
    import mx.effects.Resize;
    import mx.events.TweenEvent;
    import mx.effects.Move;
    import mx.effects.Rotate;
    
    import flash.events.MouseEvent;
    
    public class ModuleRecherche extends Canvas    {
        
        // ===============================================
        //                                              Elements                                                
        // ===============================================
        // Bouton Depliant
        private var bouton:UIComponent = new UIComponent();
        // Contour Haut
        private var contourHaut:UIComponent = new UIComponent();
        // Contour Bas
        private var contourBas:UIComponent = new UIComponent();
        // Contour Droit
        private var contourDroit:Canvas = new Canvas();
        // Ligne Pointillé
        private var lignePointille:UIComponent = new UIComponent();
        // Label du titre du module
        private var titreLabel:Label = new Label();
        // Puce Image
        private var puceImage:Image = new Image();
        [b]// Menu Deroulant
        private var DeroulantMenu:MenuDeroulant = new MenuDeroulant();
        [/b]
        // ===============================================
        //                                              Animation
        // ===============================================
        // Animation en hauteur du module de Recherche
        private var animationHeight:Resize = new Resize();
        // Animation du filet bas
        private var animationFiletBas:Move = new Move();
        // Animation du filet droit
        private var animationFiletDroit:Resize = new Resize();
        // Rotaation de la puce
        private var animationPuceRotate:Rotate = new Rotate();
        // Animation de la puce
        private var animationPuceMove:Move = new Move();
        
        // ===============================================
        //                                           Embed Image                                        
        // ===============================================
        [Embed(source='../import/swf/puce.swf')] private var puceModule:Class;
        
        // ===============================================
        //                                         Propriété statique                                        
        // ===============================================
        // Largeur du cartouche
        private static var moduleWidth:Number = new Number(223);
        // Hauteur du cartouche
        private static var moduleHeight:Number = new Number(47);
        // Durée de l'animation
        private static var durationAnimation:Number = new Number(500);
        
        // ===============================================
        //                                     Propriétés dynamique                                    
        // ===============================================
        // Titre du module de recherche
        private var __titre:String = new String();
        // nom du Bindable à surveiller
        private var __critere:Object = new Object();
        // nom des données du fichier XML
        private var __data:Object = new Object();
        
        // ===============================================
        //                                              Propriétés                                      
        // ===============================================
        // Etat du menu deroulant
        private var menuDeroulant:Boolean = new Boolean();
        // Nombre de noeud dans le fichier XML
        public var nbNode:Number = new Number();
        
        // ===============================================
        //                                            Constructeur                                            
        // ===============================================
        public function ModuleRecherche():void {
            
            this.width = moduleWidth;
            this.height = moduleHeight;
            this.horizontalScrollPolicy = "off";
            this.verticalScrollPolicy = "off";
            this.setStyle("backgroundColor", "0xFFFFFF");
            
            menuDeroulant = false;
            
            animationHeight.duration = durationAnimation;
            animationHeight.target = this;
            
            animationFiletBas.duration = durationAnimation;
            animationFiletBas.target = contourBas;
            
            animationFiletDroit.duration = durationAnimation;
            animationFiletDroit.target = contourDroit;
            
            animationPuceRotate.duration = durationAnimation;
            animationPuceRotate.target = puceImage;
            
            animationPuceMove.duration = durationAnimation;
            animationPuceMove.target = puceImage;
            
            createPointLine(1, 1, 2, 0);
            
            bouton.graphics.beginFill(0xFFFFFF,0);
            bouton.graphics.drawRect(0, 0, moduleWidth - 196, moduleHeight);
            bouton.graphics.endFill();
            
            bouton.x = 196;
            
            titreLabel.x = 14;
            titreLabel.y = 13;
            titreLabel.text = "Par agence";
            titreLabel.setStyle("fontSize", "13");
            titreLabel.setStyle("color",0x111111);
            
            contourHaut.graphics.lineStyle(1,0x6D6B6C,1);
            contourHaut.graphics.moveTo(0, 0);
            contourHaut.graphics.lineTo(moduleWidth - 1, 0);
            
            contourDroit.graphics.lineStyle(1,0x6D6B6C,1);
            contourDroit.graphics.moveTo(0, 0);
            contourDroit.graphics.lineTo(0, moduleHeight);
            contourDroit.x = 0;
            contourDroit.y = 0;
            
            contourDroit.setStyle("backgroundColor", 0x6D6B6C);
            contourDroit.x = moduleWidth - 1;
            contourDroit.y = 0;
            contourDroit.width = 1;
            contourDroit.height = moduleHeight;
            
            contourHaut.graphics.lineStyle(1,0x6D6B6C,1);
            contourHaut.graphics.moveTo(196, 0);
            contourHaut.graphics.lineTo(196, moduleHeight);
            
            lignePointille.x = 0;
            lignePointille.y = moduleHeight;
            
            contourBas.graphics.lineStyle(1,0x6D6B6C,1);
            contourBas.graphics.moveTo(moduleWidth - 1, 0);
            contourBas.graphics.lineTo(0, 0);
            
            contourBas.y = moduleHeight;
            
            puceImage.x = 206;
            puceImage.y = moduleHeight - 17;
            puceImage.source = puceModule;
            
            bouton.addEventListener(MouseEvent.CLICK, changementEtat);
            bouton.buttonMode = true;
            
            DeroulantMenu.visible = false;
            DeroulantMenu.x = 0;
            DeroulantMenu.y = moduleHeight;
            
            this.addEventListener(FlexEvent.CREATION_COMPLETE, _createElements);
            
        }
        
        // Ajout des éléments au container
        private function _createElements(event:FlexEvent):void {
            
            this.addChild(DeroulantMenu);
            this.addChild(titreLabel);
            this.addChild(puceImage);
            this.addChild(contourHaut);
            this.addChild(lignePointille);
            this.addChild(contourDroit);
            this.addChild(contourBas);
            this.addChild(bouton);
            
        }
        
        // Création de ligne en pointilé
        private function createPointLine(largeur:Number, hauteur:Number, espaceLargeur:Number, espaceHauteur:Number):void {
            
            for (var j:Number = 0; j < (this.width / espaceLargeur); j++) {
                lignePointille.graphics.beginFill(0x404040, 1)
                lignePointille.graphics.drawRect(j * espaceLargeur, j * espaceHauteur, largeur, hauteur);
                lignePointille.graphics.endFill();
            }
            
        }
        
        private function changementEtat(event:MouseEvent):void {
            
            // Fermeture du menu deroulant
            if (menuDeroulant) {
                
                animationHeight.heightFrom = this.height;
                animationHeight.heightTo = moduleHeight;
                
                animationFiletDroit.heightFrom = moduleHeight + 85;
                animationFiletDroit.heightTo = moduleHeight;
                
                animationFiletBas.yFrom = contourBas.y;
                animationFiletBas.yTo = moduleHeight;
                
                animationPuceRotate.angleFrom = puceImage.rotation;
                animationPuceRotate.angleTo = 0;
                
                animationPuceMove.xFrom = puceImage.x;
                animationPuceMove.yFrom = puceImage.y;
                animationPuceMove.yTo = moduleHeight - 15.5;
                animationPuceMove.xTo = 211.5;
                
                menuDeroulant = false;
            
            // Ouverture du menu deroulant
            } else {
                
                animationHeight.heightFrom = this.height;
                animationHeight.heightTo = moduleHeight + 85;
                
                animationFiletDroit.heightFrom = moduleHeight;
                animationFiletDroit.heightTo = moduleHeight + 85;
                
                animationFiletBas.yFrom = contourBas.y;
                animationFiletBas.yTo = moduleHeight + 85;
                
                animationPuceRotate.angleFrom = puceImage.rotation;
                animationPuceRotate.angleTo = 90;
                
                animationPuceMove.xFrom = puceImage.x;
                animationPuceMove.yFrom = puceImage.y;
                animationPuceMove.yTo = moduleHeight - 16.5;
                animationPuceMove.xTo = 210.5;
                
                menuDeroulant = true;
                
            }
                animationFiletDroit.play();
                animationHeight.play();
                animationFiletBas.play();
                animationPuceRotate.play();
                animationPuceMove.play();
                animationPuceMove.addEventListener(TweenEvent.TWEEN_START, etatMenuDeroulant);
                animationPuceMove.addEventListener(TweenEvent.TWEEN_END, etatMenuDeroulant);
        }
        
        private function etatMenuDeroulant(event:TweenEvent):void {
            if (event.type == "tweenStart") {
                if (menuDeroulant == false) {
                    DeroulantMenu.visible = false;
                }
            } else if (event.type == "tweenEnd") {
                if (menuDeroulant == true) {
                    DeroulantMenu.visible = true;
                }
            }
        }
        
        // Mise à jour du titre
        private function setTitre():void { titreLabel.text =  __titre;     }
        // Mise à jour des critères
        private function setCritere():void { trace(__critere); }
        // Mise à jour des données
        private function setData():void {
            
            nbNode = __data.agences.agence.length;
            
            trace(nbNode);
            
            for (var i:Number = new Number(0); i < nbNode; i++) {
                trace(__data.agences.agence[i].id + " - " + __data.agences.agence[i].nom);                
            }
            
            DeroulantMenu._vince();
        
        }
        
        // ===============================================
        //                                           Getter / Setter
        // ===============================================
        public function set _titre(value:String):void { __titre = value; setTitre(); }
        public function set _critere(value:Object):void { __critere = value; setCritere(); }
        public function set _data(value:Object):void { __data = value; setData(); }
        
    }
    
}


j'ai rajouter dans mon MenuDeroulant, une fonction _vince qui doit renvoyer la valeur, pour info le parentApplication fonctionne, mais comme le parent dans le cas présent n'est pas la "racine" de l'application, ne problème est toujours là !

Merci encore pour les réponses !
dada
Salut,

je sais pas s'il s'agit de çà (j'ai ptet pas compris ton problème). Mais si tu essayes d'accéder à un objet parent instancié d'une classe perso, regarde déjà quel est le type renvoyé par la propriété parent. Ce type ne contient pas la variable que toi tu as défini dans ta classe perso. Donc il faut que tu indiques au compilo que la référence renvoyée par parent est un type perso (étendu de celui par défaut).

Genre :

CODE
var monObjetParent:MaClassePerso = parent as MaClassePerso;
trace(monObjetParent.maVariablePerso);


++ smile.gif
VinceDDH
CITATION(dada @ Jun 25 2007, 02:50 PM) *
Salut,

je sais pas s'il s'agit de çà (j'ai ptet pas compris ton problème). Mais si tu essayes d'accéder à un objet parent instancié d'une classe perso, regarde déjà quel est le type renvoyé par la propriété parent. Ce type ne contient pas la variable que toi tu as défini dans ta classe perso. Donc il faut que tu indiques au compilo que la référence renvoyée par parent est un type perso (étendu de celui par défaut).

Genre :

CODE
var monObjetParent:MaClassePerso = parent as MaClassePerso;
trace(monObjetParent.maVariablePerso);


++ smile.gif


Je viens de tester, mais du coup il me renvoit une valeur null pour trace(monObjetParent); et il me fait une erreur :

TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.

avec trace(monObjetParent.nbNode); alors que je l'ai définit comme ceci : public var nbNode:Number = new Number(0);
Fusion
Bien vu pour le problème de typage. Là où tu as mis un

CODE
trace(this.parent.nbNode);


essaie

CODE
trace(ModuleRecherche(this.parent).nbNode.toString());


Pour moi ça m'a permis d'accéder à la valeur...
VinceDDH
Merci ca marche !
Mais j'aimerais comprendre pourquoi icon_question.gif
C'est la première fois que je vois ca, de mettre l'adresse de cette façon....

En tout ca merci beaucoup !
Niko
C'est la meme chose que faire :

trace(ModuleRecherche(this.parent).nbNode.toString());
trace ((this.parent as ModuleRecherche).nbNode.toString());
Fusion
En fait en écrivant ça tu fais un typage forcé de la valeur, car lorsque tu appelles parent, parentApplication par exemple, les objets obtenus sont de type DisplayOjectContainer, UIComponent, etc... Tu peux vérifier dans la doc :

http://livedocs.adobe.com/flex/2/langref/f...ect.html#parent
http://livedocs.adobe.com/flex/2/langref/m...ent.html#parent
http://livedocs.adobe.com/flex/2/langref/m...ApplicationLien
Bref, ils ont légèrement perdu leur identité.

Et inutile de préciser que ces DisplayObjectContainer, etc... ne connaissent pas la propriété nbNode. Pourtant, elle est bien là. En forçant le typage comme on le fait (on appelle ça un "cast"), on rappelle à l'application qu'on utilise bien un ModuleRecherche, et du coup, elle trouve la propriété smile.gif
VinceDDH
ok, merci pour tout, j'en apprend tous les jours icon_biggrin.gif
dada
CITATION(VinceDDH @ Jun 25 2007, 01:00 PM) *
Je viens de tester, mais du coup il me renvoit une valeur null

Un transtypage qui renvoie null a échoué, si par exemple tu essayes de transtyper vers un type autre qu'un de ceux de ton objet. smile.gif
On ne peut pas transtyper un citron vert vers une église gallo-romaine par exemple, pour prendre une image parlante (enfin... surtout stupide) icon_razz.gif
Niko
Euh, je plussoie le stupide icon_razz.gif
dada
icon_mrgreen.gif je décompresse cet aprèm', faut pas m'en vouloir j'ai envie de dire des co*****es smile.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.