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 :

Générer des boutons dynamiquement


Sujet :

Flex

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut Générer des boutons dynamiquement
    Bonjour,

    Voici mon problème :
    Je suis en train de créer une application pour un webdocumentaire, et j'aurais besoin de générer une liste de bouton correspondant à des clips vidéos.
    Ce que j'ai au départ, c'est plusieurs Array's contenant des Strings référençant mes clips.
    Au moment où un utilisateur clique sur un clip, il faut qu'il ait plusieurs boutons contenant chacun dans l'ordre un label de l'Array en question.

    J'ai essayé plusieurs choses dont :
    - une boucle Repeater dans le MXML, mais rien n'apparait.
    - créer une fonction qui addChild les boutons un par un à une HBox.

    Bref, je vous met mon dernier code, j'apprécierai vraiment de l'aide, je bloque totalement.


    Application principale :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" height="514">
     
      <mx:Script>
        <![CDATA[
          import mx.controls.Image;
          import mx.modules.*;
          import mx.collections.ArrayCollection;
     
          public var listeBouton:ArrayCollection = new ArrayCollection();
     
          public var delachaux:Array = ["delachaux", "delachaux_01", "delachaux_02", "delachaux_03", "delachaux_04"];
          public var bugnon:Array = ["bugnon", "bugnon_01"];       
     
          public function createModule(s:Array, i:int):void {      	
          	m.unloadModule();
            m.url = s[i] + ".swf";
            m.loadModule();
     
            creerListeClip(s);
            //montrerClipActif(i);
          }
     
          public function creerListeClip(s:Array):void {
          	listeBouton.removeAll();
          	//listeClip.removeAllChildren();
          	for (var y:Number = 0; y < s.length; y++) {
          		var bouton:boutonClip = new boutonClip();
          		var vignette:Image;
          		//vignette.source = "/assets/" + s[y] + "_vignette.jpg";
          		vignette.source = "@Embed('/assets/" + s[y] + "_vignette.jpg')"
          		bouton.setStyle("icon", vignette);
          		bouton.label = s[0] + " " + y;
          		bouton.setVisible(true);
          		bouton.visible = true;
          		bouton.width = 50;
          		bouton.height = 50;
          		//bouton.x = 10;
          		//bouton.y = 10;
          		//click="createModule(delachaux, 1)"
     
          		listeBouton.addItem(bouton);
          		//listeClip.addChild(bouton);
          	}
          	listeClip.unloadModule();
            listeClip.url = "listeClip.swf";
                  	//listeBouton.refresh();
            listeClip.loadModule();
     
          }
     
          public function montrerClipActif(j:int):void {
    		if (j == 1) {
    			//b01.label = "schtroumpf";
    		}
          }
     
        ]]>
      </mx:Script>
     
        <mx:Panel title="Module Example"
                height="472"
                width="90%"
                paddingTop="10"
                paddingLeft="10"
                paddingRight="10"
                paddingBottom="10">
     
            <mx:HBox width="348">
                <mx:Button label="Delachaux"
                           click="createModule(delachaux, 1)"/>
                <mx:Button label="Bugnon"
                           click="createModule(bugnon, 1)"/>
            </mx:HBox>
     
            <mx:Panel width="446" height="239">
              <mx:ModuleLoader id="m" width="100%" />
            </mx:Panel>
     
            <mx:Panel width="446" height="92">
              <mx:ModuleLoader id="listeClip" width="100%"  height="100%"/>
            </mx:Panel>
     
      </mx:Panel>
     
    </mx:Application>

    Module d'affichage des boutons :

    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
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="104">
     
    	<mx:Script>
        <![CDATA[  
     
          public function montrerClipActif(j:int):void {
    		if (j == 1) {
    			//b01.label = "schtroumpf";
    		}
          }
     
        ]]>
        </mx:Script>
     
    	<mx:HBox id="listeClip2" width="100%" height="100%">
        	<mx:Repeater id="test" dataProvider="{parentApplication.listeBouton}">
            	<mx:Button source="{test.currentItem}" />
    		</mx:Repeater>
        </mx:HBox>
     
    </mx:Module>

  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
    La première chose à faire est de rajouter le tag [Bindable] à ta variable listeBouton

    (je ne garantie pas que ce soit LA solution car ton code est un peu compliqué, mais dans tous les cas c'est nécessaire...)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut
    Salut,

    Merci pour [Bindable], je connaissais pas (j'ai débuté flex il y a 3 jours).

    J'ai revu mes objectifs, désormais je veux ajouter des boutons à une HBox un par un en fonction d'actions de l'utilisateur.
    En fait, chaque fois que l'utilisateur clique sur un clip vidéo, je veux créer un bouton avec un lien vers ce clip (le lien étant en fait une fonction contenant le nom du clip en gros).
    Je rajoute le bouton créé à la HBox, mais avant ça je teste s'il est déjà présent. Pour ça, j'utilise un ArrayCollection contenant mes boutons précédemment créé.


    Bref, ça ne marche pas avec mon code actuel, j'aimerais savoir si quelqu'un aurait un exemple de génération automatique de bouton (contenant l'appel à une fonction avec les paramètres voulus).


    Je vous met le code, dès fois que quelque chose m'aurait échappé :
    (j'ai laissé tomber de séparer l'affichage des boutons dans un module séparé)

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" height="514">
     
      <mx:Script>
        <![CDATA[
          import mx.controls.Image;
          import mx.modules.*;
          import mx.collections.ArrayCollection;
     
          [Bindable]
          public var listeBouton:ArrayCollection = new ArrayCollection();
     
          [Bindable]
          public var delachaux:Array = ["delachaux", "delachaux_01", "delachaux_02", "delachaux_03", "delachaux_04"];
          [Bindable]
          public var bugnon:Array = ["bugnon", "bugnon_01"];       
     
          public function createModule(s:Array, i:int):void {      	
          	m.unloadModule();
            m.url = s[i] + ".swf";
            m.loadModule();
     
            creerListeClip(s, i);
          }
     
          public function creerListeClip(s:Array, i:int):void {
          	for (var y:Number = 0; y < s.length; y++) {
          		var bouton:boutonClip = new boutonClip();
          		var vignette:Image;
          		//vignette.source = "/assets/" + s[y] + "_vignette.jpg";
          		vignette.source = "@Embed('/assets/" + s[y] + "_vignette.jpg')"
          		bouton.setStyle("icon", vignette);
          		bouton.label = s[0] + " " + y;
          		bouton.setVisible(true);
          		bouton.visible = true;
          		bouton.width = 50;
          		bouton.height = 50;
          		//bouton.x = 10;
          		//bouton.y = 10;
          		//click="createModule(delachaux, 1)"
     
          		var existeDeja:Boolean = false;
          		for (var u:Number = 0; u < listeBouton.length; u++) {
          			if (listeBouton[u] == bouton) {
          				existeDeja = true;
          			}
          		}
          		if (existeDeja == false) {
          			listeBouton.addItem(bouton);
          			listeClipVu.addChild(bouton);
          		}
     
          	}
          }
     
        ]]>
      </mx:Script>
     
        <mx:Panel title="Module Example"
                height="472"
                width="90%"
                paddingTop="10"
                paddingLeft="10"
                paddingRight="10"
                paddingBottom="10">
     
            <mx:HBox width="348">
                <mx:Button label="Delachaux"
                           click="createModule(delachaux, 1)"/>
                <mx:Button label="Bugnon"
                           click="createModule(bugnon, 1)"/>
            </mx:HBox>
     
            <mx:Panel width="446" height="239">
              <mx:ModuleLoader id="m" width="100%" />
            </mx:Panel>
     
            <mx:Panel width="446" height="92">
              <mx:HBox id="listeClipVu"  width="100%" height="100%"/>
            </mx:Panel>
     
      </mx:Panel>
     
    </mx:Application>

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut
    Incompréhensible...

    En mettant la plupart de mon code en commentaire, et en enlevant la boucle de création de bouton, ça marche.
    (je met le code en-dessous)

    Je vais plutôt tester des strings plutôt que des objets, mais quelqu'un saurait-il comment comparer deux objets ?



    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
          public function creerListeClip(s:Array, i:int):void {
          		var bouton:Button = new Button();
          		//var vignette:Image;
          		//vignette.source = "/assets/" + s[y] + "_vignette.jpg";
          		//vignette.source = "@Embed('/assets/" + s[y] + "_vignette.jpg')"
          		//bouton.setStyle("icon", vignette);
          		bouton.label = s[0] + ", clip " + s[i];
          		//bouton.setVisible(true);
          		//bouton.visible = true;
          		//bouton.width = 50;
          		//bouton.height = 50;
          		//bouton.x = 10;
          		//bouton.y = 10;
          		//click="createModule(delachaux, 1)"
     
          		var existeDeja:Boolean = false;
          		for (var u:Number = 0; u < listeBouton.length; u++) {
          			if (listeBouton[u] == bouton) {
          				existeDeja = true;
          			}
          		}
          		if (existeDeja == false) {
          			listeBouton.addItem(bouton);
          			listeClipVu.addChild(bouton);
          		}
     
          }

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Tout dépend de ce que tu appels comparer , l'opérateur == sur 2 objets vérifie juste si c'est la même instance .

    En gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var t1:TextField = new TextField();
    var t2:TextField = new TextField();
    t1.text ="Hello";
    t2.text ="Hello";
     
    t1==t1 ; // vrai même instance , c'est la même adresse en mémoire
    t1==t2 ; // faux car c'est pas la même instance, c'est 2 adresses différentes en mémoire
     
    t2 = t1;
    t1 == t2; // vrai car on attribue la référence de t1 à t2. Ils pointent maintenant vers la même adresse.
    Maintenant si tu veux comparer 2 objets faut que tu définisses des critères de comparaisons. Es juste le champ text du textfield qui va permettre de dire qu'ils sont bien égaux ou alors vérifier toutes les propriétés.

    Maintenant les cas particuliers ce sont les "objets de base" : String, Number, Boolean.
    L'opérateur == va bien comparer les 2 objets et pas seulement l'adresse mémoire . C'est pour simplifier la tache au développeur , en java par exemple on est obligé d'utiliser la méthode equals sur un String.

    Donc pour les objets de base ca donne ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var s1:String = new String("hello");
    var s2:String = new String("hello");
     
    var n1:Number = new Number(10);
    var n2:Number = new Number(10);
     
    trace("egal = " + (s1==s2) as String); // egal  = true
    trace("egal = " + (s1==s2) as String); // egal  = true

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut
    Merci Elendhil,

    Je connais Java, et je trouvais justement pas de méthode .equals en AS3, ce qui me semblait bizarre.
    J'utilise une double comparaison de String pour comparer mes clips maintenant.


    Sinon j'ai réussi à obtenir ce que je voulais, je crée des boutons que je rajoute à une HBox, et je place les références à ces clips dans un tableau inclus dans un tableau, ce qui me permet de vérifier mes 2 "clés d'identification".

    Bref, ça marche ^^

Discussions similaires

  1. Générer des images dynamique en php
    Par Dosix dans le forum Langage
    Réponses: 2
    Dernier message: 21/04/2009, 20h06
  2. Générer des id dynamiquement
    Par Tyler Durden dans le forum ASP.NET
    Réponses: 2
    Dernier message: 13/08/2007, 13h16
  3. faire des boutons dynamiques
    Par gotcha007 dans le forum Flash
    Réponses: 4
    Dernier message: 21/01/2007, 12h21
  4. générer des pages dynamiques a partie d'une bdd
    Par dolf13 dans le forum Langage
    Réponses: 8
    Dernier message: 03/07/2006, 13h24
  5. [FLASH 8] gérer des boutons dynamiquement
    Par gregooo dans le forum Flash
    Réponses: 1
    Dernier message: 04/02/2006, 22h22

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