[AS3] Recupérer une Array via son .name ou .id

Recupérer une Array via son .name ou .id [AS3] - Flash/ActionScript - Programmation

Marsh Posté le 20-05-2009 à 14:07:16    

Voila mon problème :
 
Admettons, j'ai :

Code :
  1. var monTableau1:Array = (.....);
  2. var monTableau2:Array = (.....);
  3. var monTableau3:Array = (.....);


 
J'ai 3 boutons : monBouton1, monBouton2 et monBouton3 dans un clip "boutonConteneur"...

Code :
  1. boutonConteneur.addEventListener(MouseEvent.CLICK, clikBouton);
  2.  
  3. function clikBouton(e:MouseEvent) {
  4.     var numBouton:String = e.target.name.substr(9); //Retourne '1', '2' ou '3' en fonction du bouton
  5.     var tableauArecup:String = "monTableau"+numBouton;
  6.     fonctionExterne(argument);
  7. }


Je veux à partir du nom du bouton sur lequel j'ai cliqué, recupéré l'array correspondant au numéro...
cet Array servira a ma fonctionExterne() qui nécessite en guise d'argument ce précieux Array
que dois-je mettre à la place de "argument" ?
bien entendu, je pourrais faire un switch, et executer ma fonction avec un argument en dure selon numBouton (surtout si il y a que 3 boutons)
ou encore, enfermer les 3 Array dans une unique Array et faire :
 

Code :
  1. var monTableau1:Array = (.....);
  2. var monTableau2:Array = (.....);
  3. var monTableau3:Array = (.....);
  4.  
  5. var uniqueTab:Array = new Array (monTableau1, monTableau2, monTableau3);
  6.  
  7. boutonConteneur.addEventListener(MouseEvent.CLICK, clikBouton);
  8.  
  9. function clikBouton(e:MouseEvent) {
  10.     var numBouton:uint= uint(e.target.name.substr(9)); //Retourne 1, 2 ou 3 en fonction du bouton
  11.     fonctionExterne(uniqueArray[numBouton]);
  12. }


Mais je trouve ça un peu lourd si j'ai beaucoup d'array...
Donc, ma question est la suivante, existe t-il une methode qui retourne un Array grâce à un nom en String ?
Exactement de la meme façon qu'on peut recupérer un movieClip à partir de son nom avec getChilByName('string')
 
Merci de pouvoir m'éclairer avec vos lanternes !


Message édité par abais le 22-05-2009 à 13:47:52

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 20-05-2009 à 14:07:16   

Reply

Marsh Posté le 22-05-2009 à 11:26:16    

Au risque de répondre a coté :
 
Tu pourrais passer la reference de l'array en tant que proprieté de chaque bouton.
 
Il serais des lors accessible depuis l'object e.target.monArray

Reply

Marsh Posté le 22-05-2009 à 11:39:33    

ça poserai le même souci...
Mon but est justement de lier dynamiquement ces arrays a mes boutons...
Je ne veux pas declarer cette propriété avec :
 
bouton1.monArray = monTableau1;
bouton2.monArray = monTableau2;
...
 
Bref, passer par un switch ou un tableau general comme decris plus haut serait mieux (ou au moins équivalent)....


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 22-05-2009 à 12:12:07    

dans ce cas, une classe perso qui etend array, dans laquelle tu ajoutes la fonction getById()
 
Mais pour le coup, les solutions dont tu parlais precedemment semblent plus rapides a mettre en place.
 
Mais extraire une string 1,2,3 ... de la propriété name du bouton n'est a mon avis pas forcement la solution la plus élégante, ni la plus optimisée. Autant attribuer à chaque bouton une variable de type integer directement.

Reply

Marsh Posté le 22-05-2009 à 13:43:59    

graphix a écrit :

dans ce cas, une classe perso qui etend array, dans laquelle tu ajoutes la fonction getById()

 

getById() n'existe pas... il n'y a pas d'equivalent, c'est que j'accuse (plus haut je demande par .name mais par .id me conviendrait aussi)
Pour des displayObject, y a pas de problème, mais pour les variables "invisible" je ne trouve pas...
à croire que les propriété ID ou NAME ne servent qu'au displayObject....

 

En JS, le getElementByID peut nous ramener à n'importe quel Elements, mais en AS il n'ont pas pensé à faire pareil faut croire...


Message édité par abais le 22-05-2009 à 13:44:49

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 22-05-2009 à 15:02:45    

Graphix te propose une bonne solution :
 
Tu crées une classe perso (MonArray extends Array) dans laquelle tu rajoutes une propriété ( id )  
et une méthode (getById( id:Number):Array ) qui te retourne l'array en question
 
monTableau:Array deviendrait monTableau:MonArray

Reply

Marsh Posté le 22-05-2009 à 15:32:53    

Le plus simple : dans la classe qui etend array, tu definit un tableau statique. private static  var tabArrays:Array = new Array();
 
Dans le constructeur de ta classe array, tu stoque la reference de chaque array étendu crée. MaClasseArray.tabArrays.push( this );
 
public function getById(id:int):MaClasseArray
{
    var lng:int = MaClasseArray.tabArrays.length;
    var i:int = 0
    while(i<lng)
    {
       if(MaClasseArray.tabArrays[i].id==id)
        {
              break;
        }
        i++
    }
     return MaClasseArray.tabArrays[i];
}
 
Je n'ai pas testé le code mais ca devrais etre ça.
Tel quel ce n'est pas parfait, si tu spécifie un id non présent cela levera une erreur, mais c'est facilement améliorable.
 
edit :
plus pratique que while :
 
public function getById(id:int):MaClasseArray
{
for each (var i:MaClasseArray in MaClasseArray.tabArrays)
{    
    if(i.id==id)
        {
            return i
            break
        }
}
}
 


Message édité par graphix le 22-05-2009 à 15:55:02
Reply

Marsh Posté le 22-05-2009 à 15:42:02    

Merci Jirotoh !
mais c'est la misère, je ne sais pas trop faire ça, je comprend l'idée de recréer une classe Array, mais je suis pas un developpeur...
Je chercherai des tutos...
Mais le fait que ça vous paraisse simple me décourage dans la prog ...
Je me contente pour le moment de ma soluce switch et je me pencherai dessus quand j'aurais le temps...


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 22-05-2009 à 15:43:03    

Oh, merci graphix !


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 22-05-2009 à 15:49:11    

Ne te décourages pas, rien n'est simple au départ, ensuite ça le deviens avec l'habitude.
 
Mieux qu'un tuto, tu as un bouquin sur l'AS3 disponible gratuitement en ebook : recherche "pratique d'actionscript 3".
Tu y trouvera notemment un exemple de classe Array perso chapitre 9.
 
Dans l'immediat ta soluce d'un tableau general fonctionne, si le coeur t'en dit tu as maintenant les pistes pour perfectionner le systeme, ou pas ;)

Reply

Marsh Posté le 22-05-2009 à 15:49:11   

Reply

Marsh Posté le 22-05-2009 à 18:24:24    

graphix a écrit :

Ne te décourages pas, rien n'est simple au départ, ensuite ça le deviens avec l'habitude.
 
Mieux qu'un tuto, tu as un bouquin sur l'AS3 disponible gratuitement en ebook : recherche "pratique d'actionscript 3".
Tu y trouvera notemment un exemple de classe Array perso chapitre 9.
 
Dans l'immediat ta soluce d'un tableau general fonctionne, si le coeur t'en dit tu as maintenant les pistes pour perfectionner le systeme, ou pas ;)


Oui je l'ai, je vais y jeter un coup d'zieux ;) Merci en tout cas


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 24-05-2009 à 12:42:02    

Pour moi ta deuxième solution est la plus simple, à part que ce n'est pas la peine d'envoyer tout le tableau

Code :
  1. var monTableau1:Array = (.....);
  2.    var monTableau2:Array = (.....);
  3.    var monTableau3:Array = (.....);
  4.    
  5.    var uniqueTab:Array = new Array (monTableau1, monTableau2, monTableau3);
  6.    
  7.    boutonConteneur.addEventListener(MouseEvent.CLICK, clikBouton);
  8.    
  9.    function clikBouton(e:MouseEvent) {
  10.        var numBouton:uint= uint(e.target.name.substr(9)); //Retourne 1, 2 ou 3 en fonction du bouton
  11.        fonctionExterne(numBouton);
  12.    }
  13.    function fonctionExterne(num:int){
  14.        trace(uniqueTab[num]);
  15.        // ou bien
  16.        trace(this["monTableau" + num]); // hmmmm ca ressamble bcp à de l'AS2 ça. Si ça marche pas, en modifiant 2-3 trucs sur cette ligne ça devrait passer.
  17.    }


Message édité par Zedlefou le 24-05-2009 à 12:42:23

---------------
Jeu de simulation Boursière - Version BETA - https://www.facebook.com/wildstocks
Reply

Marsh Posté le 24-05-2009 à 14:37:23    

Youhou, ça marche Zed, les [] te permettent bien de sélectionner n'importe quoi à partir du nom de la variable !
Je pensais que ce n'était qu'un raccourci de .getChildByName() qui ne marche que pour les DisplayObject (logique pour un "child" )...

Code :
  1. var monTableau : Array = new Array(1,2,3,4);
  2.  
  3. function traceTab(tab:Array){
  4.     trace(tab.length);
  5. }
  6.     
  7. function traceTabByName (tabName:String){
  8.     traceTab(this[tabName]);
  9. }
  10. traceTabByName('monTableau'); //retourne bien 4 !


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed