[as2]Atteindre une propriété enfant ou parent.

Résolu
sachie Messages postés 93 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 16 septembre 2010 - 30 déc. 2009 à 11:08
sachie Messages postés 93 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 16 septembre 2010 - 4 janv. 2010 à 15:12
Bonjour.

Je galère vraiment en as2.
J'ai un clip SurMenu avec sa classe SurMenu.as
J'ai un clip Menu avec sa classe Menu.as.
Dans SurMenu.as il y a une instance de Menu.

Je voudrais que lorsque je clique sur un bouton de Menu SurMenu soit averti.
J'ai pensé à trois solutions :

1-Abonner les boutons de Menu dans SurMenu.as :
this.MyMenu._cmd1.onRelease=this._cmd1DeMenuClique;

mais ma fonction _cmd1DeMenuClique de SurMenu.as n'est jamais appelée.
et en règle générale je n'arrive pas à atteindre les éléments de la classe instancé(éléments public évidement).

2-Appeler une fonction de SurMenu.as dans Menu.as, donc dans Menu.as:
//dans constructeur
this._cmd1.onRelease = this._changeFor1;

//puis hors constructeur
private function _changeFor1()
{
this._parent.OneHaveChanged();
}

Mais la fonction OneHaveChanged(public ou private) n'est jamais appelée.

3-écouteur d'événement :
Mais même problème que 1 non accès au propriété de l'instance de Menu.
De plus quand je fais ceci dans SurMenu.as:
//declaration
var lstChangeType:Object = new Object( ) ;

//puis dans le constructeur
lstChangeType.onRelease = this._typeHaveChanged;
_MenuType._cmd1.addListener(lstChangeType);

J'ai :
La méthode nommée 'addListener' n'existe pas.

Si quelqu'un a une piste Merci.
Quelqu'un que si ça continu avec as2 il va jeter le pc par la fenêtre.
A voir également:

11 réponses

sachie Messages postés 93 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 16 septembre 2010 2
4 janv. 2010 à 15:12
J'ai réussi :

Dans le constructeur:
this._cmd1.onRelease = mx.utils.Delegate.create(this, _typeChange);

Puis:
private function _typeChange()
{
_parent._typeHaveChanged();
}

Et bien j'ai bien tourné en rond juste pour ça^^
3
piere2 Messages postés 235 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 26 mai 2013
2 janv. 2010 à 23:15
Bonjour, Rien compris...
Tu veux faire quoi (en language simple);
un menu et des sous menus?
Et la possibilité d'indiquer au menu dans quel sous menu tu es?


Pi'ère2
0
sachie Messages postés 93 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 16 septembre 2010 2
4 janv. 2010 à 09:02
Bonjour Pi'ère2
Bon je vais réessayer^^

En fait j'ai une un objet Menu déclaré dans ma classe SurMenu et je voudrais que lorsque je clique sur un bouton de Menu une fonction de SurMenu soit lancée.
0
piere2 Messages postés 235 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 26 mai 2013
4 janv. 2010 à 09:44
Bonjour,
peux-tu m'envoyer le code pour que je puisse l'examiner et me donner quelques explications utiles pour faire des tests comme ce qu'il faut obtenir pour chaque bouton cliqué?


Pi'ère2
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sachie Messages postés 93 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 16 septembre 2010 2
4 janv. 2010 à 09:55
Voici ma classe SurMenu :

import lib.*;
import UI.*;
import UI.ConfigMenu.*;

class UI.SurMenu extends MovieClip
{
private var _Menu:UI.ConfigMenu.Menu;

//constructeur
public function SurMenu() 
{
this._Menu = new UI.ConfigMenu.Menu();
}

//type a changé
public function _typeHaveChanged()
{_root.catalogContainer.txtTest.text = _Menu.Type;}
}


Et voici la classe Menu :
import lib.*;
import UI.*;

class UI.ConfigMenu.Menu extends MovieClip
{
        //declarations
        private var _leType:String;
        
        private var _cmd1:Button;
        private var _cmd2:Button;
        private var _cmd3:Button;
        private var _cmd4:Button;
        
        //constructeur
        public function Menu() 
        {
                this._cmd1.onRelease = this._changeFor1;
                this._cmd2.onRelease = this._changeFor2;
                this._cmd3.onRelease = this._changeFor3;
                this._cmd4.onRelease = this._changeFor4;
                _cmd1._alpha=100;_cmd2._alpha=50;_cmd3._alpha=50;_cmd4._alpha=50;
        }
        
        //accesseurs
        public function get Type():String
        {return _leType;}
        public function set Type(theType:String)
        {_leType=theType;}
        
        
        //on change le style
        private function _changeFor1():Void
        {_leType ="1";_cmd1._alpha=100;_cmd2._alpha=50;_cmd3._alpha=50;_cmd4._alpha=50;}
        private function _changeFor2():Void
        {_leType ="2";_cmd1._alpha=50;_cmd2._alpha=100;_cmd3._alpha=50;_cmd4._alpha=50;}
        private function _changeFor3():Void
        {_leType ="3";_cmd1._alpha=50;_cmd2._alpha=50;_cmd3._alpha=100;_cmd4._alpha=50;}
        private function _changeFor4():Void
        {_leType ="4";_cmd1._alpha=50;_cmd2._alpha=50;_cmd3._alpha=50;_cmd4._alpha=100;}
        
}


En faite je voudrais appeler la fonction '_typeHaveChanged()' de SurMenu lors d'un clique sur un des boutons de Menu.
0
piere2 Messages postés 235 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 26 mai 2013
4 janv. 2010 à 10:29
Si je comprends bien tu cherches à rendre plus transparents tous les boutons de ton menu autres que celui qui est cliqué?




Pi'ère2
0
sachie Messages postés 93 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 16 septembre 2010 2
4 janv. 2010 à 10:33
Non ça c'était un autre problème que j'ai résolu, d'ailleurs le code présenté est erroné, dans les fonctions _changeFor ça devrait être _parent._cmd1._alpha=50 et non _cmd1._alpha=50.

Moi ce que je veux c'est que lorsque je clique sur _cmd1,_cmd2,_cmd3 ou _cmd4 qui se trouvent dans Menu, j'aille appeler _typeHaveChanged() que se trouve dans SurMenu.
0
piere2 Messages postés 235 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 26 mai 2013
4 janv. 2010 à 11:48
Donc un TextField dynamique affiche les états de tes boutons?
Si c'est le cas je trouve que la méthode est bien compliquée.
J'aurais juste fait un tableau contenant les valeurs alpha de mes différents boutons et attribué les nouvelles valeurs avec une boucle for à chaque clic;
ensuite avec une autre boucle for on lit le tableau et on écrit "_cmd"+i+"._alpha=" = tableau[i]


Pi'ère2
0
sachie Messages postés 93 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 16 septembre 2010 2
4 janv. 2010 à 11:55
C'est pas réellement cela.
Le TextField n'est là que pour tester la récupération d'une valeur.
L'état du alpha des boutons, ça y est c'est géré je m'en occupe plus.

Ce que je veux en gros c'est savoir si un bouton de Menu a été cliqué et si oui lequel.
Afin qu'en fonction du bouton je lance un traitement différent.

Donc j'ai pensé a appeler une fonction de SurMenu(_typeHaveChanged) depuis Menu.
Mais il y a peut être d'autres solutions.

Résumé :
J'ai ma classe SurMenu dans laquelle je déclare un objet de type Menu.
Dans Menu j'ai 4 boutons, et lors d'un clique sur un de ces boutons je voudrais que SurMenu soit averti.
0
piere2 Messages postés 235 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 26 mai 2013
4 janv. 2010 à 12:10
Je persiste donc à penser qu'il faut utiliser un tableau.
Pour savoir quel bouton a été cliqué tu peux utiliser un truc du genre:

th = this;//le menu
for(i in th){
if(th[i] instanceof Button){
th[i].onRelease = function(){
n = this._name.slice(4);
action = tableau[i];
}
}
}

ou alors mettre le code dans le boutton:
th = this;
th2 = this._parent;
th.onRelease = function(){
n = this._name.slice(4);
action = th2.tableau[i];
}


Pi'ère2
0
sachie Messages postés 93 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 16 septembre 2010 2
4 janv. 2010 à 13:59
Ok le tableau c'est une chose mais ça ne résoud pas mon principal problème, qui est de réussir à lancer la fonction _theTypeHAveChanged() de mon SurMenu depuis le Menu.
0
Rejoignez-nous