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

Flex Discussion :

Appels récurcifs de updateDisplayList dans un composant custom


Sujet :

Flex

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 25
    Par défaut Appels récurcifs de updateDisplayList dans un composant custom
    Bonjour,

    Je suis en train de développer un composant custom pour Flex qui contient un nombre dynamique de composants. Dans la redéfinition de "updateDisplayList", j'appelle donc les méthodes "removeAllChildren" et "addChildren". La seconde me pose des problèmes car elle appel de nouveau "updateDisplayList", ce qui forme un appel récursif. Avez-vous une idée sur comment éviter cet appel récursif ?

    Pour illustrer le problème, j'ai mis ci-dessous le code d'un composant simplifié.

    Merci.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    package
    {
    	import mx.containers.HBox;
    	import mx.controls.Button;
     
    	public class MyComponent extends HBox
    	{
    		private var _nbButtons:int;
     
    		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
    		{
    			trace (">>> MyComponent.updateDisplayList");
     
    			super.updateDisplayList(unscaledWidth, unscaledHeight);
     
     
    			// Tous les boutons sont effacés
     
    			this.removeAllChildren();
     
     
    			// Ajout des boutons
     
    			var button:Button;
     
    			for (var i:int = 0; i < _nbButtons; i++)
    			{
    				button = new Button();
    				button.label = "toto";
    				this.addChild(button);	// Appel de updateDisplayList
    			}
    		}
     
    		public function set nbButtons(nb:int):void
    		{
    			_nbButtons = nb;
     
    			invalidateDisplayList();
    		}
     
    		[Bindable]
    		public function get nbButtons():int
    		{
    			return _nbButtons;
    		}
    	}
    }

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    793
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2009
    Messages : 793
    Par défaut
    updateDisplayList n'est sans doute pas le bon endroit pour faire ce genre de traitement.
    Si le nombre de boutons est déterminé AVANT que l'objet soit ajouté à son parent (càd avant que createChildren soit appelé) et que ce nombre n'est pas modifié ensuite, tu peux placer ton code dans createChildren.
    Sinon tu peux le placer dans commitProperties en positionnant un boolean pour indiquer que le nombre de boutons a été modifié et recréer les boutons dans ce cas.

    Enfin dernière remarque. Plutôt que de supprimer tous les boutons et de les recréer il est préférable de supprimer ou ajouter la différence selon que la nouvelle valeur est inférieure ou supérieure à la précédente.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 25
    Par défaut
    Merci,

    Effectivement, je n'avais pas pensé à le mettre dans "CommitProperties" (honte à moi), me disant que ce bout de code n'avait que sa place dans "updateDisplayList". J'avais cherché en vain comment stopper le cycle de rafraichissement c'est pour dire...

    A noté que l'exemple joint était là pour présenter de manière simplifié le problème, sans plus, mais merci quand même pour la remarque. ^^

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/05/2010, 08h44
  2. [Joomla!] Appel d'un module dans un composant
    Par metwa dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 29/12/2009, 09h57
  3. Réponses: 1
    Dernier message: 04/06/2003, 11h48
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Une image dans un composant ?
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 11h28

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