Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flex
Flex Forum d'entraide sur la programmation Adobe Flex : applications Internet riches (RIA)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/08/2011, 17h48   #1
Membre du Club
 
Avatar de youtch
 
Inscription : septembre 2002
Messages : 91
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : septembre 2002
Messages : 91
Points : 50
Points : 50
Par défaut ajouter des objets enfants dynamiquement dans un Accordion

J'ai l'intention de créer une arborescence d'objets, qui dériveraient tous d'un objet de type Accordion "accdCategories" : en l'occurence des objets VBox qui intégreront chacun un objet Accordion, qui intégrera plusieurs objets de type VBox. Voici le premier objet en mxml :
Code :
1
2
3
4
5
6
7
8
9
 
<mx:Accordion id="accdContacts" width="100%" height="100%">
	<mx:VBox label="Par catégories" width="100%" height="100%">
		<mx:Accordion id="accdCategories" width="100%" height="100%"  backgroundColor="#AACEB0" color="#0F1355">
		</mx:Accordion>
	</mx:VBox>
	<mx:VBox label="Par noms" width="100%" height="100%">
	</mx:VBox>
</mx:Accordion>
Pour le script, je créé dynamiquement mes objets, j'instancie l'objet "obj" qui sera le descendant de "accdCategories", mais ni le type DisplayObject, ni le type VBox ne permettent de faire fonctionner ce mécanisme.
Je ne suis pas sur de devoir utiliser Display Object, est-ce le bon chemin ?

Code :
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 chargerAccordion():void{
 
	var result:SQLResult = [ requete de mes données ]
	accdContacts.removeAllChildren(); 
 
	var i:Number=0;
	for each(var elt:Object in result.data) {
		// Composition des item vBox dans accdContacts :
		i++;
		var container:VBox = new VBox();
		container.label = elt.titre+" - "+elt.description;
		container.id = "vbCategorie+"+i;
		accdCategories.addChild(container); // Ici, pas de problème l'élément Vbox est bien créé
 
		var result2:SQLResult = [ requete de mes données ]
		var j:Number=0;
		for each(var elt:Object2 in result2.data) {
			var container2:Accordion = new Accordion();
			container2.label = "Les auteurs :";
			container2.id = "vbCategorie1Auteur"+j;
			container2.addEventListener(MouseEvent.CLICK,pushData);
			var obj2:DisplayObject=accdCategories.getChildAt(i);
			obj2.addChild(container2); // Ici une erreur survient
		}
	}
}
youtch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 21h56   #2
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

je pense que c'est ton incrémentation de i qui n'est pas bonne. En effet, ton :

Code :
1
2
 
var obj2:DisplayObject=accdCategories.getChildAt(i);
au premier tour de boucle équivaut à :

Code :
1
2
 
var obj2:DisplayObject=accdCategories.getChildAt(1);
sauf que tu n'as pas d'objet à l'index 1 (les index commencant à 0)
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2011, 15h28   #3
Membre du Club
 
Avatar de youtch
 
Inscription : septembre 2002
Messages : 91
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : septembre 2002
Messages : 91
Points : 50
Points : 50
Non Madfrix, j'ai toujours une erreur "erreur 1061: Appel à la méthode addChild peut-être non définie, via la référence de type static flash.display : DisplayObject"

Oups, et aussi je me suis trompé dans mon code, et dans sa logique de construction d'arborescence, donc voici le bon code (le code MXML est nickel) :
Code :
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
 
public function chargerAccordion():void{
 
	var result:SQLResult = [ requete de mes données ]
	accdCategories.removeAllChildren(); 
 
	var i:Number=0;
 
	// pour chaque catégorie des resultats de ma requete de données
	for each(var elt:Object in result.data) { 
 
		// Composition des item vBox dans accdCategories
		var container:VBox = new VBox();
		container.label = elt.titre+" - "+elt.description;
		container.id = "vbCategorie+"+(i+1); // ( i+1 ) c'est juste pour avoir des id qui commencent à 1 !
		accdCategories.addChild(container); // Ici, pas de problème l'élément Vbox est bien créé
 
		// On génère un nouvel objet Accordion qui contiendra les auteurs de la catégorie en cours
		var container2:Accordion = new Accordion();
		container2.label = "Les auteurs :";
		container2.id = "accdCategorie"+(i+1)+"Auteurs"; 
		var obj2:DisplayObject=accdCategories.getChildAt(i);
		obj2.addChild(container2); // Ici une erreur survient, l'erreur 1061: Appel à la méthode addChild peut-être non définie, via la référence de type static flash.display:DisplayObject
 
		i++;
 
		var result2:SQLResult = [ requete de mes données des auteurs, pour la catégorie en cours] 
		var j:Number=0;
		// Pour chaque auteur de la catégorie en cours
		for each(var elt2:Object in result2.data) {
			// (...)
			j++;
		}
	}
}
Deuxième question (indépendante de la première) : dans la boucle 2, on ajoutera les différents auteurs de la catégorie en cours, mais comment sélectionner un objet dont l'ID est une variable que l'on vient de générer ?
Je pense qu'on doit reprendre les indices i dans le nom des objets sur lesquels on appliquera addChild dans la boucle 2... là je sèche !
youtch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 16h06   #4
Membre habitué
 
Inscription : avril 2010
Messages : 124
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 124
Points : 135
Points : 135
Salut,

Si je comprends bien, tu récupères dans la variable obj2 la VBox que tu as créé juste avant et qui se trouve dans l'objet container ?!
Tu récupères ligne 22 ce que tu viens d'ajouter ligne 16.

Donc pour ton souci : simplement virer la ligne 22 et remplacer la 23 par
Code :
container.addChild(container2)
Ce que tu fais pourrait aussi marcher mais il faudrait utiliser DisaplyObjectContainer ou UIComponent en lieu et place de DisplayObject. Tu pourrais même utiliser VBox puisqu'en l’occurrence, tu sais qu'il s'agit d'une VBox...

Pour ta question 2, y a différentes solutions...Mais faut voir quel est vraiment le problème. As-tu besoin d'identifier les auteurs ? Pourquoi ? N'ont-il pas déjà des id uniques en base plutôt que d'en générer dynamiquement coté client ?

Edith a corrigé l'ortho
clemoigno est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h29.


 
 
 
 
Partenaires

Hébergement Web