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

Flash Discussion :

[FLASH 8] Problème avec les listener


Sujet :

Flash

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 274
    Points : 134
    Points
    134
    Par défaut [FLASH 8] Problème avec les listener
    Bonjour,

    j'aimerai savoir comment synchroniser 2 traitements paralleles.
    Je m'explique :
    j'ai un fonction getElement, qui regarde si l'element est en mémoire et qui le retour ou le charge en fonction.
    MAIS, le traitement de chargement est exécuté en parallèle.

    voila ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    	public function getElement(_cle:String):Object {
     
    		if (memoire[_cle] != undefined) {
    			return (memoire[_cle]);
    		}
     
    		else {
    			var listener = new Object();
    			listener.loaded = function(evtObjt) {
    				trace("Chargement de l'element : Ok");
    				// Il faudrait faire un return pour que getElement retourne une valeur
    			};
    			this.addListener(listener);
    			this.chargementElement(_cle);
    		}
    	}
    si on entre dans le if, un object est retourné, donc c'est bon.
    si on entre dans le else, le chargement de l'element est exécuté, mais aucun élément n'est retourné
    Il faudrait faire un return dans 'listener.loaded', pour que getElement retourne une valeur.


    comment puis-je faire ?


    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 274
    Points : 134
    Points
    134
    Par défaut alors ????
    j'aimerai juste savoir si c'est possible que la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listener.loaded = function....
    retourne un objet,
    pour que ma méthode getElement puis retourner un élément si on entre dans le bloc 'else'


    Merci de me répondre rapidement

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 274
    Points : 134
    Points
    134
    Par défaut alors ?
    ce problème est toujours d'actualité,

    j'attends une reponse (meme négative)

    merci d'avance

  4. #4
    Membre actif Avatar de younes_
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 229
    Points : 265
    Points
    265
    Par défaut
    Bonjour,
    Moi je pense qu'il vaut mieux de déclarer une méthode loaded au sein de la classe et déviter d'utiliser un object listener dans getElement puisqu'il va exister que dans cette fonction, voilà un apercu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function getElement(_cle:String):Object {
     
          if (memoire[_cle] != undefined) {
             return (memoire[_cle]);
          }
          else {
             this.chargementElement(_cle);
          }
       } 
    public function loaded(evtObjt) {
                trace("Chargement de l'element : Ok");
    }
    Quelque part il faut renseigner le listener comme étant la classe elle même addListener(this);
    a+
    ------------------------
    Website Interactive Object

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 274
    Points : 134
    Points
    134
    Par défaut
    merci pour cette remarque,

    mais comment fais tu pour retourner une valeur dans le bloc 'else' ?????
    c'est tout le sens de mon message sur le forum

    merci

  6. #6
    Membre actif Avatar de younes_
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 229
    Points : 265
    Points
    265
    Par défaut
    Salut,

    On peux pas récupérer les données depuis la fonction getElement puisqu'il n'ont pas été chargées encore. Une des solutions est d'utiliser un événement qu'on déclenche une fois que les informations ont été récupérés:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import mx.events.EventDispatcher;
     
    class monDelaClass 
    {
    private var dispatchEvent : Function;
    	private addEventListener : Function;
    	private var removeEventListener : Function;
    // Stocke la clé de recherche actuelle
    private var cle_courant:String;
     
    public function nomDelaClass()
    {
    EventDispatcher.initialize (this);
    addEventListener ("onResult", this);
    }
    public function getElement(_cle:String){
     
          if (memoire[_cle] != undefined) {
                dispatchEvent ( {type : "onResult", result : memoire[_cle]});
          }
          else {
             cle_courant = _cle;
             this.chargementElement(_cle);
          }
       }
    public function loaded(evtObjt) {
           // Mettre les données dans la mémoire
           memoire[cle_courant] = evtObjt;
           dispatchEvent ( {type : "onResult", result : memoire[cle_courant]});
    }
    ...
    }
    Exemple d'utilistation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var c:monDelaClass = new monDelaClass();
    c.getElement("unecle");
    c.onResult = function(eventObject:Object)
    {
    trace(eventObject.result);
    }
    ------------------------
    Website Interactive Object

  7. #7
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    Hello !!

    Aldo m'avait demandé à la rescousse, mais il me semble que l'explication de younes_ rejoint ce que j'aurai expliqué.

    Par contre, je ne comprend pas très bien ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function nomDelaClass()
    {
    EventDispatcher.initialize (this);
    addEventListener ("onResult", this);
    }

    pourquoi tu fais le addListener la dessus ?? je capte pas...
    En réalité, tu devrai faire la chose comme suivant :

    supprimer le addEventListener, qui ne sert à rien dans le constructeur... ce n'est pas la classe elle même qui doit attendre le dispatch de "onResult", c'est l'instance qui sera déclarée par la suite, à mon avis...

    Donc supprimer le addEventListener situé dans le constructeur, et lors de l'utilisation faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var c:monDelaClass = new monDelaClass();
    var obj:Object = new Object();
    obj.onResult = function( evt:Object )
    {
    trace( 'onResult : ' + evt.result )
    }
    c.addEventListener( 'onResult', obj );
    c.getElement("unecle");
    ça me semble plus logique, non ?? c'est comme lorsque tu abonne un objet à un évenement d'un composant. Le addEventListener est affecté à partir de l'instance de composant, pas dans la classe elle-même.

    Vala mon humble avis.

    a++

  8. #8
    Membre actif Avatar de younes_
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 229
    Points : 265
    Points
    265
    Par défaut
    Citation Envoyé par titouille
    Hello !!

    ça me semble plus logique, non ?? c'est comme lorsque tu abonne un objet à un évenement d'un composant. Le addEventListener est affecté à partir de l'instance de composant, pas dans la classe elle-même.

    a++
    C'est juste pour simplifier les choses, n'empêche que cette méthode fonctionne aussi, seule la classe va reçevoir l'évenement dans ce cas. Ca reste une question de conception à la fin
    ------------------------
    Website Interactive Object

  9. #9
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    Ok, la classe intercepte l'évenement car tu as fait un addEventListener sur elle-même (this).

    Mais tu ne le traite pas ?? ça fonctionne parceque tu utilise dispatchEvent et que tu affecte directement sur l'instance en faisant :

    monInstance.onResult

    mais à ce moment, tu pourrais très bien te passer du dispatcher, qui est inutile dans ton code...

    A la place de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dispatchEvent ( {type : "onResult", result : memoire[_cle]});
    pour envoyer l'évenement, il te suffit alors de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // dans les déclarations : 
    public var onResult:Function;
     
    // à chaque fois que tu dois "dispatcher" l'évenement, dans ta classe :
    onResult( ...params... )

    Car dans ton code, au final, tu utilise le dispatcher pour envoyer, mais pas pour abonner... Ou plutot tu abonne mais tu ne traite pas...
    Ce n'est pas à la classe de traiter onResult, c'est à la classe de le dispatcher.
    C'est un objet externe (objet, fonction) qui va s'occuper de traiter la valeur retournée. C'est la le but du jeu, à priori.

    Dans ton exemple, tu peux tout bonnement supprimer toutes les déclarations concernant le dispatcher, car en réalité, tu n'aurai pas du tout besoin de l'utiliser... une simple déclaration de fonction comme je l'explique suffirait amplement. Ton dispatcher ne fait qu'alourdir ta classe alors qu'il est "inutile" dans ta façon de l'utiliser... Autant utiliser une fonction standard, à ce moment là.


    Moi aussi, je faisais ce genre d'erreur au départ. Il faut essayer d'imaginer comment tu utilise addEventListener, removeEventListener avec les composants V2, tu devrai comprendre comment implémenter ensuite tes objets pour qu'ils dispatchent leurs évenements correctement


    a++

  10. #10
    Membre actif Avatar de younes_
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 229
    Points : 265
    Points
    265
    Par défaut
    Citation Envoyé par titouille
    Moi aussi, je faisais ce genre d'erreur au départ. Il faut essayer d'imaginer comment tu utilise addEventListener, removeEventListener avec les composants V2, tu devrai comprendre comment implémenter ensuite tes objets pour qu'ils dispatchent leurs évenements correctement
    Le système d'évènement par délégation je connais bien mais c'est vrai dans ce cas, avoir un dispatcher pour la classe elle-même ne sert pas à grand chose enfin de compte j'y pas pensé... Autant pour moi et merci pour les explications
    ------------------------
    Website Interactive Object

  11. #11
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    de rien

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Points : 218
    Points
    218
    Par défaut
    J'ai essayé de suivre tout votre raisonnement mais je suis un peu perdu.
    J'ai la classe suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import flash.net.FileReference;
    class File{
    	public var onResult:Function;
    	function File(){
    	}
    	function SelectionFichier(){
     
    		var listener:Object = new Object();
    		listener.onSelect = function(file:FileReference) {
    			 onResult(file.name);
    		}
    		listener.onCancel = function(file:FileReference) {
    			 onResult("false");
    		}
    		var fileRef:FileReference = new FileReference();
    		fileRef.addListener(listener);
    		fileRef.browse(); 
    	}
    }
    Et je voudrais savoir si dans le fonction SelectionFichier il a bien sélectionner ou non un fichier...
    L'appel ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	var fich:File=new File();
    	fich.SelectionFichier();
    	fich.onResult = function()
    	{
    		trace("ok");
    	}
    Mais il ne trace jamais le Ok....
    J'ai du loupé un épisode....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/05/2010, 14h21
  2. Réponses: 10
    Dernier message: 08/07/2006, 11h12
  3. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  4. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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