Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flash > AS3
AS3 Questions relatives à la programmation ActionScript 3 (Cours AS3)
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 29/09/2011, 15h41   #1
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 131
Points : 37
Points : 37
Par défaut Label créé dynamiquement

Bonjour!
Vos compétences pourraient me sortir (encore une fois) du gouffre dans lequel je me mets assez fréquemment!

Voilà le problème:
Je créé n label à partir de n lignes retournées d'une requête select d'une bdd sqlite.
Les labels sont créés, je leur donne un id mais je ne peux pas y faire référence ailleurs. Je pensais que c'était une histoire de portée. Mais même avec des fonctions publiques ça ne marche pas. Peut être que la fonction qui créé les label devraient les retourner?
Voici le code correspondant:
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
 
public function clicBesoin():void
{
sqls4.text = "select id_besoinF,lbl_besoinF,Unite,AffichF,coordX,coordY,largeur from besoinF order by AffichF DESC;";
sqls4.execute();
sqls4.addEventListener(SQLEvent.RESULT, CreerChps);
resultats_ration();
}
public function CreerChps(e:SQLEvent):void
{
var donnees:Array = sqls4.getResult().data;
dapa = new ArrayCollection(donnees);
var lab:Label;
for (var j:uint=0; j<donnees.length;j++){
        lab=new Label();
	lab.id="valBesoinF"+donnees[j]["id_besoinF"];//valBesoinF1 par exemple
	lab.name="valBesoinF"+donnees[j]["id_besoinF"];
	lab.text="0";
	lab.move(donnees[j]["coordX"]+donnees[j]["largeur"]+10,donnees[j]["coordY"]);
	resRationT.addElement(lab);
}
}
public function resultats_ration():void
{
valBesoinF1.text="12314";//Ne fonctionne pas
}
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 16h52   #2
Membre habitué
 
Inscription : avril 2010
Messages : 124
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 124
Points : 135
Points : 135
Ton premier problème ici c'est que tes labels n'existent pas encore lorsque tu y fais référence dans ta fonction resultats_ration.
Flex fonctionne en asynchrone sur les appels distants.

Déjà, j'ai jamais fonctionné comme tu le fais mais je suis surpris de l'ordre
Code :
1
2
sqls4.execute();
sqls4.addEventListener(SQLEvent.RESULT, CreerChps);
J'aurais inversé ces deux lignes mais là je ne suis pas certain du tout de la chose. Ça revient peut-être au même.

Bref, toujours est-il que tu demandes au serveur BD d’exécuter une requête et tu dis à ton client flex que sur le retour tu veux qu'il exécute la fonction CreerChps. Et dans la foulée, tu appelles resultats_ration.
Mais à ce moment précis, le serveur n'a pas encore répondu (il est en train d’exécuter la requête) et CreerChps n'a pas encore été appelée, donc tes labels pas encore créés.

Si ce que je te dis n'est pas clair, met un debug('coucou') au début de CreerChps et un debug('toto') au début de resultats_ration. Tu verras que toto arrive avant coucou.

Appelle donc ta méthode resultats_ration à la fin de ta méthode CreerChps et ça marchera mieux.
clemoigno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 17h20   #3
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 131
Points : 37
Points : 37
Merci Clemoigno de ta réponse.
J'ai donc fait appel à resultats_ration à la fin de CreerChps mais ça ne change rien.
Pire, avec un bouton j'appelle la fonction Btn1 et il ne reconnait toujours pas valBesoinF1 (Pourtant lab.Id créé valBesoin1 c'est étrange)
Code :
1
2
3
4
5
 
public function Btn1(e:MouseEvent):void{
	var valBesoinF1:Label;
	valBesoinF1.text="tttt";
}
Le label valBesoinF1 est sur la scène mais n'est plus utilisable dès lors qu'on sort de la méthode CreerChps.
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 08h52   #4
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 131
Points : 37
Points : 37
J'ai l'impression que c'est dans l'utilisation de addElement que le soucis vient.
Mais addChild ne fonctionne pas... En fait non, car le composant Label est un composant spark et est donc associé à la méthode addElement...
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 09h44   #5
Membre habitué
 
Inscription : avril 2010
Messages : 124
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 124
Points : 135
Points : 135
Hello

Citation:
J'ai donc fait appel à resultats_ration à la fin de CreerChps mais ça ne change rien.
Si si, ça change quelquechose je t'assure. Avant tu n'avais aucune chance que cela marche car ton composant label n'existait pas au moment ou tu voulais y accéder. Maintenant, il existe bien, c'est juste que t'y accèdes pas correctement :-)


Essaie un truc genre
Code :
(resRationT.getElementByName('valBesoinF1') as Label).text = 'toto'
clemoigno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 10h08   #6
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 131
Points : 37
Points : 37
Bien vu clemoigno!
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
 
public function clicRation():void
{
	sqls4.sqlConnection = sqlc;
	sqls4.text = "select id_besoinF,lbl_besoinF,Unite,AffichF,coordX,coordY,largeur from besoinF order by AffichF DESC;";
	sqls4.addEventListener(SQLEvent.RESULT, CreerChps);
	sqls4.execute();		
}
public function CreerChps(e:SQLEvent):void
{
	var donnees:Array = sqls4.getResult().data;
	dapa = new ArrayCollection(donnees);
	var lab:Label;
 
	for (var j:uint=0; j<donnees.length;j++){	
		lab=new Label();
		lab.id="valBesoinF"+donnees[j]["id_besoinF"];
		lab.name="valBesoinF"+donnees[j]["id_besoinF"];
		lab.text="0";
		lab.move(donnees[j]["coordX"]+donnees[j]["largeur"]+10,donnees[j]["coordY"]);
		lab.height=21;
		lab.width=42;
		if(donnees[j]["id_besoinF"]==1){lab.text="124"; resRationT.addElementAt(lab,5)/*Alert.show("champ= "+lab.id)*/}
		else{
		resRationT.addElement(lab);
		}
	}
	resultats_ration();
}
public function resultats_ration():void
{
	(resRationT.getElementAt(5) as Label).text = 'toto'
}
Par contre getElementByName ne fonctionne pas. J'utilise donc getElementAt mais il n'y a pas moyen de récuypérer l'élément par son nom? (ainsi je pourrais faire : getElementByName("valBesoinF3+donnees[j]["id_besoinF"]) dans une boucle)
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 10h26   #7
Membre habitué
 
Inscription : avril 2010
Messages : 124
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 124
Points : 135
Points : 135
Arf bon j'ai jamais utilisé de composants Spark mais apparemment les containers spark ne gère pas le getChildByName().

Faut voir s'il y a un équivalent sur les containers sparks. Sinon peut-être peux tu utiliser un container mx plutôt que spark.

Enfin peut-être peux-tu essayer d'accéder dynamiquement à ton objet en faisant
Code :
(resRationT['valBesoinF1'] as Label).text = 'toto'
clemoigno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 10h32   #8
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 131
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 131
Points : 37
Points : 37
Non il n'en veut pas. Je n'ai même pas été capable de trouver cette doc (fort explicite) lol!

Va pour un programme avec l'id!

Je te remercie!
granchef est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h55.


 
 
 
 
Partenaires

Hébergement Web