IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ActionScript 3 Discussion :

closure/variable finale : comment faire?


Sujet :

ActionScript 3

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut closure/variable finale : comment faire?
    Salut,

    Je souhaite ajouter des handlers d'évènements lors d'une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(var i:int=0; i < 10; i++) {
        var image:Image = new Image();
        image.addEventListener(MouseEvent.CLICK,
            function():void {
                imageClicked(i);
            }
        );
    }
    Le problème, c'est que le i utilisé est dans une closure, et donc qu'il partage le "scope" de la boucle : c'est le même i.
    Ainsi, quelque soit l'image (de la 1ère à la 10e), l'évènement appellera imageClicked(10) (car à la fin i vaudra 10).

    J'ai donc pensé à utiliser une variable qui elle, ne change pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(var i:int=0; i < 10; i++) {
        var image:Image = new Image();
        var constantIndex = i;
        image.addEventListener(MouseEvent.CLICK,
            function():void {
                imageClicked(constantIndex);
            }
        );
    }
    Mais apparemment, il utilise le même emplacement de variable "constantIndex" pour les 10 tours de boucle, même s'il est utilisé dans une fonction (car constantIndex vaut 10 quelque soit l'image également).

    J'ai égament tenté de déclarer cette variable final, comme on ferait en java, mais il ne veut pas de "final" pour une variable...

    J'ai tenté également de la déclarer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var constantIndex:int = new int(i);
    pour forcer la recopie, au cas où cela viendrait d'une affectation par adresse et non par valeur, rien n'y fait...

    Comment faire ?

  2. #2
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Par défaut
    Bonjour ®om,

    Je me rappel avoir fait ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function imageClicked(event:MouseEvent){
        trace(event.target.constantIndex);// On devrai retrouver la valeur de 'i' ...
    }
    for(var i:int=0; i < 10; i++) {
        var image:Image = new Image();
        image.constantIndex = i;// On enregistrer le nom/index dans l'instance image
        image.addEventListener(MouseEvent.CLICK, imageClicked )
    }
    En espérant que cela puisse t'aider

Discussions similaires

  1. Réponses: 15
    Dernier message: 10/03/2014, 19h40
  2. Réponses: 15
    Dernier message: 25/04/2006, 17h59
  3. Comment faire une variable de session correctement
    Par Battosaiii dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 10/04/2006, 21h46
  4. [c#] Variable globale ? comment faire ?
    Par afaverot dans le forum Windows Forms
    Réponses: 1
    Dernier message: 03/02/2006, 14h15
  5. [ADO.Net][C#/SQL 2005] Comment faire INSERT avec variable ?
    Par hduchemin dans le forum Accès aux données
    Réponses: 1
    Dernier message: 25/01/2006, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo