Boucle et validation de données actionscript

Signaler
Messages postés
21
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
15 janvier 2009
-
Messages postés
337
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
4 janvier 2011
-
Bonjour à tous,

Voilà, je bloque sur ce code et je tourne en rond...
Le
script est celui d'un clip qui permet de vérifier ce qui a été saisi
par l'utilisateur en le comparant à des valeurs stockées dans un
tableau.

Au début j'utilisais des valeurs numériques et j'avais
pas besoin de tableau (et ça marchait;-)) mais je voulais laisser le
choix de saisir des décimales avec des points ou des virgules.
Trace lit bien le contenu de mes tableaux mais je ne parviens pas à faire la comparaison avec les textes saisis... Peut être que je fais fausse route avec des tableaux....
Voici le code :

on (release) {
    var v1:Array = ["400.4","400,4"];
    var v2:Array = ["411.5","411,5"];   
    var vv1:String = v1_txt.text;
    var vv2:String = v2_txt.text;
   

for(var p:String in v1)
{trace(v1[p]);  
}

for(var m:String in v2)
{trace(v2[m]);  
}
 
    if (vv1!=v1[p] || vv2!=v2[m]) {
        message_txt.text = "C'est faux. Essayez à nouveau";}
       
        else {message_txt.text = "C'est exact!";
        valid_btn._visible=false;
        suite_mc._visible=true;
        }   
   
}
Je ne trouve pas de tutoriaux spécifiques à mon problème...
Merci par avance pour votre aide

14 réponses

Messages postés
337
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
4 janvier 2011

Bonjour,

Quand tu dis :


Au début j'utilisais des valeurs numériques et j'avais pas besoin de tableau (et ça marchait;-)) mais je voulais laisser le choix de saisir des décimales avec des points ou des virgules.

Tu es passé au tableau juste pour pouvoir rentrer des décimales? Oo
Messages postés
21
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
15 janvier 2009

Non c'était juste pour attribuer à v1 plusieurs valeurs possibles et autoriser la saisie avec point ou virgule.

Le tableau me semblait plus approprié pour stocker les différentes réponses possibles.
Messages postés
337
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
4 janvier 2011

Pour commencer :

Il faut éviter au maximum de poser son scipt sur les bouton et autre objet de la scène sinon ca deviens le Bronx...

Je comprend toujours pas pourquoi tu utilise des tableau avec 2 fois la même valeur mais bon...

Nomme t'es variables avec des noms plus explicite parce que la c'est super tendu a relire...

En quoi code tu? AS2 ? AS3?...

Quand tu arrive a cette ligne la :
if (vv1!=v1[p] || vv2!=v2[m]) {

Tu prévois qu'elle a quelle valeur la variable p et la var m? Elles sont définis ou??? parce que bon c'est soit brouillon soit incomplet !
Messages postés
21
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
15 janvier 2009

Je vais déplacer mon script dans le scénario.

J'ai du zapper un truc mais ce sont 2 valeurs différentes pour moi XXX,
XX et XXX.
XX. Alors peut être que je me plante complétement.

Quoi qu'il en soit lorsqu'on arrive là :
   if (vv1!=v1[p] || vv2!=v2[m]) {


Je prévois que que p et m doivent avoir le contenu de leurs tableaux respectifs pour en comparer les valeurs à celles saisies.

C'est un vrai brouillon car c'est la première fois que je touche à ce genre de manip (boucle, tableau...)

J'avais pensé à une conversion des caractères saisis pour régler cette histoire de décimale avec point ou virgule mais je me suis dit qu'en passant sur des tableaux je pourrais réutiliser le principe sur toute sorte de saisie.
Messages postés
337
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
4 janvier 2011

(effectivement j'avais pas vu la différence entre le . et la ,)

Donc pour ton v1[p] il a la valeur de la case p de ton tableau v1...

Au passage les écriture les plus courante pour un tableau sont plutôt de type :

var myArray:Array = Array("firstElement", "secondElement", "thirdElement");

Ensuite par exemple si tu fait
trace(myArray[0]); flash t'affiche firstElement
trace(myArray[1]); flash t'affiche secondElement
...

Donc si ton p au moment de ton test n'as aucune valeur ou une valeur qui n'est pas dans le tableau ton test échoue...

A mon avis ton p est undefined...
(fais un trace p juste avant ton if pour voir ^^')
Messages postés
1378
Date d'inscription
samedi 9 octobre 2004
Statut
Membre
Dernière intervention
1 novembre 2010
1
Pourquoi ne pas tout convertir en Number ???

var v1:Array = [400.4,400,4];
var v2:Array = [411.5,411,5];
// on "'cast" les variables récupérées des TextField dynamiques
var vv1:Number= Number( v1_txt.text );
 var vv2:Number= Number( v2_txt.text );

Ensuite tu peux effectuer tes comparaisons tranquillement...
bali_balo....=]
Messages postés
21
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
15 janvier 2009

Je me suis servi de ce que tu m'as écrit et ça donne ça :

on (release) {
    var v1:Array = Array("400.4", "400,4");
    var v2:Array = Array("411.5", "411,5"); 
    var vv1:String = v1_txt.text;
    var vv2:String = v2_txt.text;
  

if (vv1==(v1[0]) || vv1==(v1[1]))
{
    var p:Number=1;
    trace(p);
    }
else {
        var p:Number=0;
        trace(p);
        }; 

 if (vv2==(v2[0]) || vv2==(v2[1]))
{
    var m:Number=1;
    trace(m);
    }
else {
        var m:Number=0;
        trace(m);
        }; 

 
    if (m!=1 ||p!=1) {
       
        message_txt.text = "C'est faux. Essayez à nouveau";}
      
        else {message_txt.text = "C'est exact!";
        valid_btn._visible=false;
        suite_mc._visible=true;
        }  
  
}

ça fonctionne mais je n'ai plus de boucle et je trouve mon script laborieux. En fait je n'ai pas trouvé comment comparer des valeurs saisies en lisant des tableaux...
Messages postés
21
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
15 janvier 2009

oups j'avais pas raffraichi ma page et je n'ai pas vu ton précédent message. comme tu dis : bali balo ;-)

j'essaye cette solution pour voir
Messages postés
337
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
4 janvier 2011

La solution de bali balo est bonne mais je voulais que tu comprenne un peu comment marche les tableaux... :D

Tu devrais lire quelque tuto dessus tu en as besoin :D
Messages postés
21
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
15 janvier 2009

ça veut dire que mon script est tout pourri?

En fait je pense avoir compris le principe du tableau
montableau[0]
montableau[1]
montableau[2]

Mais c'est tout ce qui gravite autour et surtout la comparaison d'un élément au contenu de plusieurs tableaux... J'ai vu bcp de tutos sur la chose mais ça traite principalement du remplissage dynamique ou de la lecture du contenu.
Je tiens vraiment à comprendre car je vais en avoir souvent besoin...

Bali balo ===> le fait de caster la saisie c'est la transformer en number (123,5 devient 123.5)?
Si c'est le cas je peux faire juste une comparaison sur une valeur numérique?

petit à petit l'oiseau fait son nid
Messages postés
1378
Date d'inscription
samedi 9 octobre 2004
Statut
Membre
Dernière intervention
1 novembre 2010
1
En fait avant tu comparais des String entre eux. Il est plus juste que
tous ces valeurs numériques soient de type Number. Cela évite dans un
premier temps les bugs de comparaison entre les String et les bugs de
concaténation.


J'ai fait rapidement ce test :
var s:String = "403.1";
trace( Number(s) );
Cela affiche bien 403.1
Mais si je fais :
var s:String = "403,1";
trace( Number(s) );
Cela m'affiche NaN. Donc en fait si tu veux laisser la possibilité à l'utilisateur de saisir soit un "." soit un "," ou voire même un autre séparateur, il va falloir que tu traites d'abord tes String. C'est-à-dire tu regardes les String enregistrés et si tu vois que l'utilisateur a saisie un "," alors tu transformes ce "," en "."
Ensuite tu peux caster comme je te l'ai montré.

Si je ne suis pas très clair, rappel moi de façon concis et explicite ton problème, ou plutôt le résultat que tu veux obtenir.
bali_balo....=]
Messages postés
21
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
15 janvier 2009

Au début mon test ne traitait que des number et j'avais mis une condition if Nan pour guider la saisie. Or il s'est avéré que des utilisateurs saisissaient les décimales avec la virgule... Donc je me suis dit que j'allais tout mettre dans un tableau dans le but de réutiliser ce script pour d'autres éléments que des number.
 
Le résultat que je souhaite obtenir est le suivant :
- plusieurs champs de saisie qui comparent leur contenu à des tableaux respectifs contenant plusieurs réponses possibles.
- faire évoluer la chose en indiquant quels sont les champs faux.

En gros il me manque le moyen de comparer les valeurs saisies à celles des tableaux.

La conversion "," en "." est pratique mais je serai confronté au même probleme lorsque je n'aurai à traiter que des string.

Voilà tu sais tout :-) j'espere avoir été clair et concis.
Messages postés
21
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
15 janvier 2009

J'ai parcouru de nombreux tutoriaux et je suis parvenu à la solution suivante :
on (release) {
    var v1:Array = Array("400.4", "400,4");
    var v2:Array = Array("411.5", "411,5"); 
    var vv1:String = v1_txt.text;
    var vv2:String = v2_txt.text;
  

for (var i = 0;i<v1.length; i++) {    if (vv1 v1[i]&& vv2 v2[i]){
        message_txt.text = "C'est juste!";
        trace ("correct");
        trace (v1[i]);
        trace (v2[i]);
        break;

    }
 else {message_txt.text = "C'est faux!";
         trace ("faux");

        }  }

 
}

ça fonctionne mais lorsque je saisi une valeur avec le point et l'autre avec une virgule il me considère la réponse comme fausse....
Je pense que ça vient de i et qu'il faudrait que je crée une autre variable pour j mais je ne sais pas comment intégrer la chose à mon for (var i = 0;i<v1.length; i++)....

Auriez-vous une petite idée?

Par avance merci.
Messages postés
337
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
4 janvier 2011

Dans l'état actuel des choses il te faudrait deux boucles for pour faire ce que tu veux...

Le plus propre reste donc ce que te suggère bali_balo de convertir ta chaine récupéré en number (avec number() ou parseFloat())