Forums Développement Multimédia

Aller au contenu

Dictionary mon ami...

dictionary colorpicker xml as3 textfield CODE Actionscript

23 réponses à ce sujet

#1 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 10:38 AM

Bonjour,

Je suis de retour, avec un nouveau problème... pour changer.

Tous d'abord j'hésitais à mettre ce message à la suite de mon ancien poste "colorpicker avec xml" mais je me suis dit que j'aurais plus de change d'avoir des réponses rapide avec un nouveau sujet.

Comme vous l'aurez compris je souhaite utiliser la fonction Dictionary (qui à l'air plutôt efficace) pour l'associer à mon colorpicker (finger in the nose).

Ceci fonctionne mais maintenant un nouveau problème intervient.

Pour afficher le nom des couleurs dans le "textefield" du colorpicker je ne sais comment procédé pour dire : la "couleur" que tu "pointe" cherche dans le "dicotionnaire" pour avoir son "nom".

Pour commencer je souhaite remercier Nataly car c'est dans ce tutoriel que j'ai rencontrer la fonction dictionary (http://forums.mediab...ivite/coloriage).

Donc voici pour mon code :

public function SelectColor() { //importation du xml
   requete = new URLRequest("coul.xml");
   myLoader.addEventListener(Event.COMPLETE, processXML);
   myLoader.load(requete);
   }
 
  private function processXML(e:Event){ // faire afficher le xml
   myXML = new XML(e.target.data);
   //trace (myXML);
   xml = myXML.couleur;
 
   for each(couleur in xml){ // création du dictionnaire
    prop = new Object;
    prop.valeur = couleur.valeur
    prop.nom = couleur.nom
    test[prop] = couleur;
    yeah.push(test[prop].valeur); // création du tableau contenant les couleurs
    yup.push(test[prop].nom); // création du tableau contenant les noms
   }
   trace(test[prop].nom); // affiche uniquement le nom de la dernière couleur
   init()// appelle de la fonction init
  }
 
 

Donc voila mon tableau "yeah" me permet de générer la palette de couleur de le colorpicker (merci a Badwolf pour la méthode)

Ensuite je pensais pouvoir utiliser le tableau "yup" contenant les noms des couleurs pour ensuite l'intégrer à la palette mais il n'y a pas moyen.


cp.addEventListener(ColorPickerEvent.ITEM_ROLL_OVER, majChamp);
private function majChamp(e:ColorPickerEvent){ // testé avec "e" et "ce"
   e.target.TextField.text = yup.toString() ; // j'ai essayé de différente mannière mais rien ne fonctionne.
  }
 

Donc:

Question 1 :

Comment faire? (:

Question 2 :

Pourquoi quand je fais "trace(test[prop].nom)" j'obtiens uniquement le dernier "nom",
pareil lorsque je fais "trace(test[prop])" j'obtiens le dernier objet en entier :


<couleur>
  <nom>Or</nom>
  <valeur>0xB3B2B2</valeur>
</couleur>
 


J'espère avoir été claire dans ma demande sinon n'hésiter pas je vous donnerais d'avantage d'explication.

Merci d'avance,

Kainry.

#2 Badwolf

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 667 messages

Posté 05 December 2012 - 11:50 AM

Hello

question1:

ta méthode est bonne.

c'est juste que yup est un tableau , tu dois affecter une valeur de ce tableau, comme yup[1] par exemple.


cp.addEventListener(ColorPickerEvent.ITEM_ROLL_OVER, majChamp);
private function majChamp(e:ColorPickerEvent){
   e.currentTarget.TextField.text = yup[1];
  }
 

après si tu veux faire correspondre la couleur et le libellé tu dois pousser le truc plus loin.


cp.addEventListener(ColorPickerEvent.ITEM_ROLL_OVER, majChamp);
private function majChamp(e:ColorPickerEvent){
          var cp:colorPicker = e.currentTarget as colorPicker;
        for(var z:* in yeah){
                if(yeah[z] == e.color){
                        event.currentTarget.textField.text = yup[z];
                        break;
                }      
        }
  }
 

tu devras aussi initialiser le textField

question 2

c'est une question de logique, dans ta boucle tu crées plusieurs variables "prop" donc a la sortie de la boucle , "prop" correspond à la dernière valeur de "prop" connue.

Je ne sais pas si je suis clair, pour t’expliquer regardes ce code simple:


var test:uint=0
for(var i:uint = 0; i< 10; i++){
test = i;
}
trace(test);

 
"test" vaudra la dernière valeur qui lui a été affectée dans la boucle à savoir 9
Haoooooooooooooooooooooooooooooooooooooooooooooou !!!

#3 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 13:09 PM

Merci Badwolf pour ta réponse, je vais essayer ça tous de suite,

Et donc pour faire afficher toutes les valeurs du dictionnaire on fait comment? (pour simple culture G et même si je vois [object Object] 250 fois)
Mais sinon oui je comprend le système de logique du fait qu'il montre la dernière.

Par contre petite question pourquoi fait tu ceci :


var cp:colorPicker = e.currentTarget as colorPicker;
 


#4 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 05 December 2012 - 13:13 PM

Salut,

Je pense que tu te compliques pas mal la tâche, un Dictionnary permet de créer des tableaux associatifs ( clé => valeur ). La clé peut prendre n'importe quel type,

Tu parses ton XML [ attention au nom typage de couleur => for each( var couleur:XML in xml) ] et tu souhaites faire correspondre tes couleurs ( type numérique ) à une chaine de caractères.

Toi tu passes par un objet comme clé, c'est en soit intéressant mais pas forcément optimal. Si tu relis le but que tu recherches, tu distingueras tout de suite, ce qui est la clé, ce qui est la valeur.

=> Associée des couleurs à des chaines => test[uint(couleur.valeur)] = couleur.nom => J'ai bien associé un nombre à une couleur.

Et donc après tu peux récupérer le nom de la couleur avec la valeur numérique de celle-ci

Morgan

PS toutes les valeurs d'un dictionnaire ça doit être un truc du genre :


// tu peux remplacer l'étoile par le type de clé que tu utilises
for(key:* in test){
        trace(p, test[p]);
}

 


var cp:colorPicker = e.currentTarget as colorPicker;
//Il précise que la cible de l'évènement ( celui qui l'émet ) est un ColorPicker ( le type est perdu dans l'évent, c'est un Object //comme tout le reste si l'on ne fait pas de "as" )
 

Word hard, play hard.

#5 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 13:51 PM

Merci pour ta réponse Morgan,

Cependant je pensais que c'étais plus optimal vue que par la suite je souhaitais réutiliser le nom de la couleur.

Petite explication :

Je change la valeur de la forme. Par la suite je souhaiterais avoir le nom des couleurs utilisés sur chaque forme.
Et je pensais justement qu'avec un dictionary c'étais le moyen le plus optimal de faire correspondre couleur/nom

Je sais pas si j'ai été clair.

Mais merci encore je vais voir ce que je pourrais faire.

#6 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 December 2012 - 13:58 PM

Voir le messageGalacta, le 05 December 2012 - 13:13 PM, dit :

//Il précise que la cible de l'évènement ( celui qui l'émet ) est un ColorPicker ( le type est perdu dans l'évent, c'est un Object //comme tout le reste si l'on ne fait pas de "as" )

Je n'en suis pas certain…
Si le paramètre perçu est bien typé ColorPickerEvent, alors le type du target est ColorPicker…



import fl.controls.ColorPicker;
import fl.events.ColorPickerEvent;

var myColorPicker:ColorPicker = new ColorPicker();
myColorPicker.addEventListener(ColorPickerEvent.ITEM_ROLL_OVER, changeHandler);
myColorPicker.move(10, 10);
addChild(myColorPicker);

function changeHandler(event:ColorPickerEvent):void {
  trace(event.target is ColorPicker); // true
  trace("Couleur survolée:", event.color);
}

Par contre, pour l'usage du Dictionary, je suis d'accord avec toi.
Les clés doivent être tout simplement les valeurs, et il faut juste stocker le nom.
Attention effectivement au type de la valeur obtenue via le xml pour qu'elle corresponde à la clé obtenue par event.color…

#7 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 December 2012 - 14:12 PM

Voilà un exemple simplifié de ce que tu cherches à faire :


import fl.controls.ColorPicker;
import fl.events.ColorPickerEvent;

var couleurs:Array = [];
couleurs[0]=[0xFF0000];
couleurs[1]=[0x00FF00];
couleurs[2]=[0x0000FF];

var noms:Dictionary = new Dictionary();
noms[0xFF0000]="Rouge";
noms[0x00FF00]="Vert";
noms[0x0000FF]="Bleu";

var myColorPicker:ColorPicker = new ColorPicker();
myColorPicker.colors=couleurs;
myColorPicker.addEventListener(ColorPickerEvent.ITEM_ROLL_OVER, changeHandler);
myColorPicker.move(20, 20);
addChild(myColorPicker);

function changeHandler(event:ColorPickerEvent):void {
  myColorPicker.textField.text = noms[event.color];
}


Ce qui'il te reste à adapter :
parcourir les couleurs de ton xml :
pour chaque couleur :
- ajouter sa valeur au tableau couleurs
- ajouter son nom au dictionary en passant la valeur comme clé
   for each(couleur in xml){
        couleurs.push[couleur.valeur];
        noms[couleur.valeur] = couleur.nom;
   }


#8 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 14:16 PM

heu...

Voir le messagedldler, le 05 December 2012 - 13:58 PM, dit :

je suis d'accord avec toi.

c'est qui toi?

et donc pour la création du dictionnaire je m'y prend comment?

for each(plop in xml){ // plop anciennement couleur
couleur = plop.valeur;
couleur.nom = plop.nom;
test[couleur] = plop;
}
 
??

#9 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 14:16 PM

ah bah je viens de voir que tu avais refait un post...

#10 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 December 2012 - 14:19 PM

Voir le messageKainry, le 05 December 2012 - 14:16 PM, dit :

heu...
c'est qui toi?
:-) Généralement, "toi" est celui que je cites. Et dans ce cas particulier, c'était galacta. Excuses moi si ça t'a perturbé.

#11 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 14:24 PM

non justement j'étais pas sur.... c'est pour ça ^^ je voulais simplement une précision. :)

#12 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 14:29 PM

Je ne suis pas sûr d'avoir bien compris ce que tu m'avais montrer (dIdIer ^^)

je créer d'abord un tableau avec les couleurs,
Pour ensuite affecter à chaque couleur un noms via le dictionary?

Ou dans ma boucle for j'établis ce que tu m'as donné... (valeurs est un array? )


for each(couleur in xml){
            valeurs.push[couleur.valeur];
            noms[couleur.valeur] = couleur.nom;
   }
 

Merci de ta réponse.

#13 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 December 2012 - 14:32 PM

En résumé :
var couleurs:Array = [];
var noms:Dictionary = new Dictionary();



for each (couleur in xml)
{
  couleurs.push[couleur.valeur];
  noms[couleur.valeur] = couleur.nom;
}

myColorPicker.addEventListener(ColorPickerEvent.ITEM_ROLL_OVER, changeHandler);

function changeHandler(event:ColorPickerEvent):void {
   myColorPicker.textField.text = noms[event.color];
}


#14 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 14:42 PM

J'obtient une erreur...
Mon code :

   for each(couleur in xml){
    valeurs.push[couleur.valeur];
    noms[couleur.valeur] = couleur.nom;
   }
 
L'erreur :

ReferenceError: Error #1069: La propriété 0xFFFFFF est introuvable sur builtin.as$0.MethodClosure et il n'existe pas de valeur par défaut.
at Dico/processXML()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
 
mon XML :

<?xml version="1.0" encoding="UTF-8"?>
<base>
  <couleur><nom>v0</nom><valeur>0xFFFFFF</valeur></couleur>
  <couleur><nom>v8</nom><valeur>0x111111</valeur></couleur>
  <couleur><nom>v9</nom><valeur>0x1B1B1B</valeur></couleur>
</base>
 

Désolé mais je ne vois pas où est le problème étant donner que même avant ça fonctionnais ...

Mais merci pour ton résumé =)

#15 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 14:45 PM

oops désolé c'est bon j'ai trouvé c'est pour le push... c'est des parenthèses "()" et non des crochet "[]"

#16 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 15:13 PM

Bon bah j'ai encore un souci :oops: ...

le champ text ne veux pas se modifier...
le code :

  private function majChamp(e:ColorPickerEvent){
         cp.textField.text = noms[e.color]; // j'ai éssayé en changeant cp en ce (comme sur le tuto), en rajoutant "target/currentTarget" rien a faire...
  }
 
 
Si vous avez une idée pourquoi?

également j'ai ce message qui apparaît à chaque passage de souris sur une couleur :

TypeError: Error #1010: Un terme n'est pas défini et n'a pas de propriété.
at fl.controls::ColorPicker/setSwatchHighlight()
at fl.controls::ColorPicker/onSwatchOver()
 

j'ai oublié un paramètre quelque part? :/

#17 Badwolf

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 667 messages

Posté 05 December 2012 - 15:19 PM

pour ta 1ère question essaies de faire un trace(e.color) et voir si la couleur qui en résulte est bien une des clés de ton tableau noms.
Haoooooooooooooooooooooooooooooooooooooooooooooou !!!

#18 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 15:28 PM

oui mon trace(e.color) m'affiche la couleur voulu.

#19 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 15:31 PM

mais un trace(noms[e.color]) ne fonctionne pas : undefined

#20 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 December 2012 - 15:34 PM

C'est juste parce que le type de ta clé est au format xml et pas uint (on avait essayé de t'alerter sur le sujet…).

Apres tests, ça devrait passer en forçant le type à uint, comme ça :
couleurs.push(uint(couleur.valeur));
noms[uint(couleur.valeur)] = couleur.nom;


#21 Badwolf

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 667 messages

Posté 05 December 2012 - 15:37 PM

si tu regardes les valeurs de tes couleurs (dans le XML et donc les clés de noms), ce ne sont pas les mêmes valeurs ni le même format que e.color

donc c'est normal que noms[e.color] soit undefined car la clé n'existe pas.
Haoooooooooooooooooooooooooooooooooooooooooooooou !!!

#22 Kainry

    Ceinture Orange

  • Members
  • PipPipPip
  • 46 messages

Posté 05 December 2012 - 15:47 PM

ok ! bah c'est parfait ! MERCI bien

et désolé d'avoir été négligeant j'avais pas bien fait attention à l'alert sur le fait d'être en xml.

Merci pour vos réponse :)

#23 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 05 December 2012 - 19:28 PM

Voir le messagedldler, le 05 December 2012 - 13:58 PM, dit :

Je n'en suis pas certain…
Si le paramètre perçu est bien typé ColorPickerEvent, alors le type du target est ColorPicker…



import fl.controls.ColorPicker;
import fl.events.ColorPickerEvent;

var myColorPicker:ColorPicker = new ColorPicker();
myColorPicker.addEventListener(ColorPickerEvent.ITEM_ROLL_OVER, changeHandler);
myColorPicker.move(10, 10);
addChild(myColorPicker);

function changeHandler(event:ColorPickerEvent):void {
  trace(event.target is ColorPicker); // true
  trace("Couleur survolée:", event.color);
}

Par contre, pour l'usage du Dictionary, je suis d'accord avec toi.
Les clés doivent être tout simplement les valeurs, et il faut juste stocker le nom.
Attention effectivement au type de la valeur obtenue via le xml pour qu'elle corresponde à la clé obtenue par event.color…

Tu as raison, et j'ai raison aussi Didier, c'est ce que l'on appelle le polymorphisme dynamique. le type qui va être contenu dans e.target n'est pas connu à la compilation, il est connu pendant l'exécution du programmation ( d'où le dynamique ), si tu regardes dans la doc e.target/e.currentTarget sont de types "Object", tout simplement pour pouvoir y mettre n'importe quel 'type', car tout est object en AS3.

Si tu veux une preuve, tu peux faire un tableau d'event (J'entends Vector.<Event>), dans lequel tu mets un Event, un MouseEvent, un KeyboardEvent. Tu pourras ajouter chaque event dans le tableau car ils ont tous un ancêtre commun => Event, et le compilateur le prendra comme ça ( il cast pour faire concorder le type j'imagine ). Cependant si tu traces le type de chacun se seront bien des Mouse/Keyboard Event car c'est leur type à proprement parlé.

De même si tu fais un Vector<Object> tu peux y mettre tout ce que tu veux ( sauf les types simples et natifs String, uint, int ... ), malgré le fait qu'il soit typé Object.

J'espère que je n'ai pas été trop flou ! :)

Si tu veux plus d'info je te suggère http://www.commentca...o/polymorp.php3

Morgan
Word hard, play hard.

#24 Badwolf

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 667 messages

Posté 05 December 2012 - 19:33 PM

perso j'avais typé "colorpicker" pour avoir accès a l'autocomplétion des méthodes et des propriétés au sein de l'IDE

en gros je suis une feignasse :D
Haoooooooooooooooooooooooooooooooooooooooooooooou !!!



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP