ComboBox : évenement sur changement

  • warning: array_map(): Argument #2 should be an array in /var/www/titouille.ch/www/modules/system/system.module on line 1050.
  • warning: array_keys() expects parameter 1 to be array, null given in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
  • warning: Invalid argument supplied for foreach() in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
Portrait de titouille

Voilà un petit bout de code pour vous montrer comment déclencher un évenement lors d'une modification sur une liste déroulante :

Créez un nouveau fla, placez-y un composant de type "ComboBox" et nommez le "myCbo". Cliquez ensuite sur la scène, ouvrez le panneau ActionScript et collez-y le code suivant :

myCbo.dataProvider = [
		{data:0, label:"SELECT", url:"" },
		{data:0, label:"google", url:"http://www.google.ch" },
		{data:1, label:"yahoo", url:"http://www.yahoo.fr" },
		{data:2, label:"altavista", url:"http://www.altavista.com" }
		];

var listenerObj:Object = new Object ();
listenerObj.change = function (evt:Object)
	{
	// récupération de l'item sélectionné
	var it:Object = evt.target.getItemAt (evt.target.selectedIndex);
	// affichage de la page correspondante à l'url
	getURL (it.url, "_blank");
	}
myCbo.addEventListener ('change', listenerObj);

Vous pourrez constater différente choses assez intéressantes dans ce code :

Tout d'abord, j'utilise sa propriété "dataProvider" pour remplir la liste déroulante. Cette propriété prend en charge un tableau d'objets contenant différentes données. l'utilisation des colonnes "data" et "label" permet de faire un remplissage automatique des données, avec en valeur affichée la colonne "label", et en valeur identifiante la colonne "data". L'utilisation de ces petits + en valent la peine, lorsque celà est possible. Il faut sinon passer par les méthodes de dataBinding de la classe DataGlue pour donner un affichage cohérent à une liste déroulante si le dataProvider à des noms de colonnes communs.

Ma liste déroulante utilise les colonnes "data" et "label", mais ce qui est implicite, c'est que les autres colonnes existent toujours lorsque je lie le tableau à la liste déroulante. donc je peux stocker autant de données que je veux pour 1 seul item de ma liste, et les récupérer simplement grace au gestionnaire d'évenement.

Le but étant de récupérer une valeur qui appartient à l'item, j'utilise la méthode "getItemAt" qui me permet de récupérer un item à un index précis. Et cet index est directement indiqué par la propriété "selectedIndex" de la liste déroulante.
Une fois mon item récupéré, je peux facilement utiliser ses valeurs masquées pour générer les processus désirés.




Portrait de titouille

Je viens de tester :

Main.fla :
code sur calque 1 :

var ctnr:MovieClip = this.createEmptyMovieClip( 'ctnr'

Je suis en train de bosser au pays de galles sur un projet d'organisation de galas entre differentes piscines a travers le monde, et dans le cadre de ce projet, javais besoin de manier des combobox, or je ne trouvais nul part comment rajouter des elements un par un a partir d'une requete mysql (middleware php),
merci beaucoup pour ce topic, qui va tres certainement me debloquer !
Merci encore, je retourne coder Laughing out loud (et desole pour les accents manquants mais ces f*ck*ngs claviers en qwerty sont pas pratiques ^^)
See U!

Portrait de titouille

Salut JC Turin !

L'important, dans le remplissage des composants héritant de liste, est d'utiliser les 2 valeurs "data" et "label" dans les noms de colonnes.
Si tu passe ces 2, ta liste sera automatiquement remplie avec les bonnes valeurs. Si tu utilise d'autres valeurs comme nom de colonnes, tu devra utiliser la classe DataGlue pour faire des liaisons effectives. Donc ça simplifie pas mal le travail.

Et si tu travaille avec Remoting, tu peux aisément faire ta requête, récupérer un dataProvider valide et le passer directement à la propriété dataProvider de ton composant.

A++

je viens de lire avec attention ce paragraphe concernant la combobox , mais je reste coincé par rapport a mon probleme perso a ce sujet...tout d'abord je debute en flash et j'ai créé dans mon site une page "reservation" qui contient les habituels champs de texte de saisie et une combo a trois item correspondant a des nom de salles...
lorsque le formulaire est rempli on le valide avec un bouton et c'est la que je n'arrive pas a recuperer l'item selectionnée par l'utilisateur...en fait je ne sais pas ou inserer le type de code indiqué dans ce paragraphe...
pour les champs de texte de saisie , lors de l'instruction "onrelease" de mon bouton valider j'effectue un simple
"trace" mais pour la combo pas moyen de recuperer quoique se soit je ne sais pas comment m'en sortir !!
Un peu d'aide serait la bienvenue...merci d'avance

Portrait de titouille

Pour ton problème, tu n'as même pas besoin d'utiliser de gestionnaire d'évenement...

Une combo a des propriétés tels que selectedItem, selectedIndex, etc...

Dans ton on(release), tu pourrai simplement récupérer tout d'abord l'objet combobox, genre :

// je fais un casting, en AS2, pour récupérer l'objet et pouvoir travailler sur ses méthodes...
// ce n'est pas obligatoire, tu pourrai simplement faire : var cbo = this._parent.mycbo;
var cbo:mx.controls.ComboBox = mx.controls.ComboBox( this._parent.mycbo ); 

puis ensuite, tu n'as plus qu'a récupérer l'objet sélectionné :

var obj = cbo.selectedItem;
trace(obj.data);
trace(obj.label);

Vala, je pense que ça devrai suffir.

Bon courage, a++ Wink

c sympa de t'interresser à mes soucis...quand tu parles d'integrer le control du composant , tu parles du code action script qui le construit ? je sais vraiment pas ou l'integrer dans mon scenario principal...
j'ai essayer plusieurs solution mais ca marche toujours pas...pour exemple mon scenario principal contient en fait le menu general de mon site et reste accessible quelque soit l'animation chargée...le swf reservation est appelé par un simple bouton et est chargé dans un clip cible installé sur mon scenario principal...voici le script que k'ai ecrit dans mon swf "reservation":
boxsalle.dataProvider = [
{data:0, label:"Choisissez"},
{data:0, label:"Kapitole"},
{data:1, label:"Le Club"},
{data:2, label:"Trance Fer"}];
var listenerObj:Object = new Object ();
listenerObj.change = function (evt:Object){
var salle:Object = evt.target.getItemAt(evt.target.selectedIndex);
trace(salle.label);
choixsalle = salle.label;
}
boxsalle.addEventListener ("change", listenerObj);

si tu pouvais me diriger encore un peu ce serait genial...
@++

Portrait de titouille

tu as simplement à glisser un composant comboBox depuis le panneau composant sur la scène de ton fla principal, puis le supprimer. Le composant sera intégré à la bibliothèque du fla principal, et fonctionnera dans les swf chargés.

Bon courage, a++

bouh... ca change rien je vais arreter de t'embeter avec ca je crois...je vais chercher une autre solution je crois
mais ce qui est bizarre c'est que ca ecrit quand meme le "choisissez" qui est le premier label il n'y a que les autres choix qui ne s'affichent pas...enfin bref ...merci pour ton aide quoiqu'il en soit
@++

EUKEKA , j'ai trouvé ...je tenais quand meme a te tenir au courant vu les efforts que tu as fait pour m'aider...
ca n'avais rien a voir avec le contenu du code ou la présence de la combo dans mon swf principal...en fait vu que j' ai commencé a utiliser flash mi decembre j'ai fait beaucoup de test avec ma premiere animation et en particulier au niveau publication...et j'avais publié en flash et donc pas d'as 2 !! c'est en lisant un bouquin sur action script que j'ai lu que les composants ne fonctionnait qu'en as2...et voila c'etait la seule partie de mes swf publié de cette maniere et ca resoud en meme temps pas mal de probleme que je ne pouvais solutionner et pour cause....je me sens plus leger ya quand meme 2000 € a la clé quand ce sera terminé...A charge de revanche en ce qui te concerne...comme je ne peux pas faire grand chose pour toi en flash ou AS vu mon ptit niveau,par contre je pourrai e rendre la pareille en ce qui concerne la musique et tout ce qui s'y rattache alors qi tu as besoinde qquechose album titre remix jingle...ce sera avec plaisir
@ +++ et merci encore

ben non decidement...ca veux pas ! j'ai meme essayé en appelant ton "external" depuis mon swf principal ,mais la difference c que c est un bouton qui charge mon swf externe dans un conteneur placé sur la scene principale et la rien a faire...la combo est bien placée dans la bibliotheque du fla principal...jsuis a la rue...lol
ca vient ptetre de mon fla principal qui est composé de 15 calques et de 200 frames.
Je vais continuer a tester d'autre solution
merci de ton aide c super sympa
je te tiendrai au courant...

oui merci beaucoup j'ai reussi a me depatouiller de ce prob mais je suis maintenant confronté a un autre souci...mon formulaire marche bien ainsio que la combo mais ceci uniquement quand je travaille sur le.swf "reservation" seul, des que je me retrouve dans le cade de mon menu general ou le "reservation.swf" est appelé par un loadMovie et bien il ne reste que la premiere ligne de la combo et aucune item n'apparait et la combo ne s'ouvre meem pas alors que les autres champs de tesxte de saisie , eux repondent normalement...jsuis perdu ...lol

Portrait de titouille

En fait, c'est tout simple. Tu dois intégrer ton composant à ton anim principale... le contrôle ComboBox doit se trouver dans la bibliothèque principale pour fonctionner dans les swf externes chargés.

Il existe une "liste des composants à intégrer dans le fla de base pour que les dits composants fonctionnent dans les swf chargés" mais je n'ai plus l'url... Mais si un contrôle ne fonctionne pas dans un fichier externe, c'est certainement pour ça.

a++