Oggi vedremo come gestire il componente ComboBox in Adobe Flash.
La casella combinata (ComboBox) consente all’utente di effettuare una sola selezione da un elenco a comparsa e può essere statica o modificabile. Una casella combinata modificabile consente all’utente di immettere il testo direttamente in un campo di testo presente all’inizio dell’elenco e selezionare una voce dall’elenco a comparsa.
Se l’elenco a comparsa raggiunge la fine del documento, viene aperto verso l’alto anziché verso il basso.
Quando viene effettuata una selezione nell’elenco, l’etichetta della selezione viene copiata nel campo di testo presente nella parte superiore della casella combinata. La selezione può essere effettuata sia con il mouse che con la tastiera utilizzando i tasti freccie direzionali e Tab.
Inseriamo la combobox sullo Stage
Andiamo su Finestra >> Componenti >> ComboBox
Una votla inserita sullo stage, assegnamo un nome istanza come combo
A questo punto andiamo a vedere il codice da inserire nel primo fotogramma:
//leggi e carica i dati dal file xml
dati_xml = new XML(); // nuovo oggetto XML
dati_xml.ignoreWhite = true; // elimino gli spazi tra le parole
dati_xml.onLoad = function(success) { //se è stato caricato
if (success) {
// leggo i nodi del file XML
var nodes = this.firstChild.childNodes;
for (var i = 0; i var descrizione = nodes[i].attributes.descrizione;
var valore = nodes[i].attributes.valore;
var itemz = {label:""+descrizione+"", data:""+valore+""};
_root.combo.addItem(itemz);
}
} else {
trace("no load");
}
};
dati_xml.load("list.xml"); // nome del file xml
//fine caricamento
//associa evento al combobox
combolistener = new Object(); // nuoovo oggetto
combolistener.change = function(eventObj) { // funzione cambia
var eventSource = eventObj.target; // impsoto il target
var elemento = eventSource.selectedItem; // impsoto l'elemento
var valoreelemento = elemento.label; // impsoto il valoreelemento
var datavaloreelemento = elemento.data; // impsoto il datavaloreelemento
stato.text = "Hai premuto "+valoreelemento+" il suo valore è "+datavaloreelemento;
};
combo.addEventListener("change", combolistener); // associo l'evento
Invece questo è il file XML, in cui inseriremo le voci e i valori nella ComboBox
<?xml version="1.0" encoding="iso-8859-1"?>
<elenco>
<item descrizione="Button1" valore="1"></item>
<item descrizione="Button2" valore="2"></item>
<item descrizione="Button3" valore="3"></item>
<item descrizione="Button4" valore="4"></item>
<item descrizione="Button5" valore="5"></item>
<item descrizione="Button6" valore="6"></item>
<item descrizione="Button7" valore="7"></item>
<item descrizione="Button8" valore="8"></item>
<item descrizione="Button9" valore="9"></item>
<item descrizione="Button10" valore="10"></item>
</elenco>
42 Commenti
ciao
Ma se invece del valore vorrei mettere gotoandplay ad un frame si puo fare?
Nelle condizioni IF basta inserire
_root.gotoAndStop(2);
qualora la risposta sia giusta o sbagliata…
Grazie mille!
:)
ciao julius, mi rivolgo di nuovo a te perchè non so come risolvere un enigma riguardante comboBox…perdonami se non è la sezione esatta per postare ma non sapevo dove scriverlo, spero tanto in un tuo consiglio.
Ho creato un swf principale che chiama (tramite loadMovie in un mc vuoto) un altro swf che contiene un componente comboBox(che a sua volta legge i dati un un db access) problema: il combo non si apre.
Soluzione che ho trovato:
1) importare questo componente nella libreria dell’swf chiamante, così mi funziona perfettamente ma non può essere la strada giusta (aumenta di parecchi kb il mio swf principale)
2) chiamare l’swf contenete combo tramite loadMovieNum e non con loadMovie, (ma così facendo ho dei problemi a livello grafico per via di come ho strutturato il menu principale)
Secondo te quale potrebbe essere la strada giusta?
grazie davvero tanto.
Ciao julius,
è possibile associare a ogni pulsante del combovox un’azione in modo da spostarsi all’interno del filmato flash tipo gotoAndPlay(1);
Ho visto la domanda di Nemo ma sinceramente non ho capito dove inserire quanto da te risposto.
Grazie in anticipo per il tempo che vorrai dedicarmi
Ciao
Io vorrei creare un combobox interattivo
Praticamente ho due combo box In uno imposto una macrocategoria e a seconda di ciò che viene scelto mi dovrebbe caricare un diverso xlm che imposta le label del secondo combobox
Ho seguito il tutorial ed è tutto ok (anzi grazie). L’unico mio problema è che se scelgo una categoria e poi ne scelgo un’altra nel secondo combobox le label del secondo xlm vanno a sommarsi al primo e non a sostituirsi
Cosa posso fare?
grazie in anticipo per l’attenzione
Controlla di avere associato un nome diverso al gruppo forse vanno in conflitto?
“le label del secondo xlm vanno a sommarsi al primo”
non riesco a capire come sia possibile…
praticamente questo è quello che succedeva:
io ho un combobox con delle macrocategorie (categoria01, categoria 02 e categoria03)
Se selezionavo categoria01 nel secondo combo box mi apparivano le sottocategorie della 01 Se, poi, selezionavo categoria 03 alla sottocategorie01 si sommavano quelle della 03
Alla fine ho risolto usando il comando combobox.removeAll()
Adesso ho un altro problema:
come faccio a fare in modo che il secondo combobox venga aggiornato appena seleziono una categoria nel primo?
ti allego lo script così faccio prima:
1° frame:
onEnterFrame = function() {
_root.serie = scelta_serie.getValue();
}
on (press) {
scelta_modelli.removeAll()
//leggi e carica i dati dal file xml
dati_xml = new XML(); // nuovo oggetto XML
dati_xml.ignoreWhite = true; // elimino gli spazi tra le parole
dati_xml.onLoad = function(success) { //se è stato caricato
if (success) {
var nodes = this.firstChild.childNodes;
for (var i = 0; i<nodes.length; i++) {
var descrizione = nodes[i].attributes.descrizione;
var valore = nodes[i].attributes.valore;
var itemz = {label:””+descrizione+””, data:””+valore+””};
_root.scelta_modelli.addItem(itemz);
}
} else {
trace(“no load”);
}
};
switch (_root.serie) {
case “Classic” :
dati_xml.load(“classic.xml”);
break;
case “Hi-Tech” :
dati_xml.load(“hitech.xml”);
break;
case “Work” :
dati_xml.load(“work.xml”);
break;
}
combolistener = new Object();
combolistener.change = function(eventObj) {
var eventSource = eventObj.target;
var elemento = eventSource.selectedItem; var valoreelemento = elemento.label;
}
};
scelta_modelli.addEventListener(“change”, combolistener);
Funziona solo se associo questo script alla pressione di un pulsante
Cosa sbaglio?
come non detto Sono riuscita
Grazie
Ma come faccio a formattare questo combo box??
Per esempio voglio cambiare i colori o le dimensioni della freccia…
come si fa? per ora ho trovato questo:
combo.antiAliasType = String;
combo.fontSize = “11”;
combo.rollOverColor = “0xAAAAAA”;
combo.selectionColor = “0xa9e4ff”;
combo.color = “0x000000”;
combo.disabledColor = “0x000000”;
ma pensavo ci fosse un modo tipo per “entrare” dentro il simbolo….
Personalizzare componente combo box
Ciao julius,
è possibile associare a ogni pulsante del combovox un’azione in modo da spostarsi all’interno del filmato flash tipo gotoAndPlay(1);
Ciao silvia
puoi intercettare la pressione del campo nella combo come è descritto in questo tutorial
Se noti esce la scritta con il numero di campo in combobox selezionato
Invece del numero tu puoi associare il valore nel file xml con il numero di frame e usare la funzione
gotoAndPlay(valoreelemento);
in questo modo sarai inviata al frame scelto dalla combo
ciao julius
grazie della risposta ma nn riesco ancora a usare combo, dove devo inserire la stringa? in stato text?…. e il numero di frame va inserito nell’xml dove c’è valore=”2”?
grazie mille
Silvia
Nel file XML imposti i valori riferiti ai button1
ad esempio button1 = 1 nel file XML
quando cliccherai dalla combo button1 sarai rimandata la fotogramma 1
e il go to and play dove lo metto?
grazieeeeee
Linea 27 dove trovi
stato.text = “Hai premuto “+valoreelemento+” il suo valore è “+datavaloreelemento;
inserisci
_root.gotoAndPlay(valoreelemento);
“Hai premuto “+_root.gotoAndPlay(valoreelemento)+” il suo valore è “+datavaloreelemento
ho messo cosi e mi da valore indefinito nell xml ho messo
grazias
questo ho messo nell’xml
ciau
item descrizione=”button2″ valore=”button2=2″></item
Da dove è uscito valore=”button2=”? :)
esempio con primo pulsante della combo ti mansa al frame 20
nel file xml scrivi
<item descrizione="Button1" valore="20"></item>
poi Linea 27 dove trovi inserisci
_root.gotoAndPlay(valoreelemento);
grazie julius sei il n1!!
ciao giulius una domanda, non capisco perche’ il combobox funziona visionando il singolo flash mentre se guardo il flash principale che carica l’swf in questione il combobox non funziona. come mai? eppure i parametri sono quelli e basta…..
Potebbe essere un errore di percorsi
devi sapere che quando richiami un oggetto in un swf con _root e poi lo inglobi in un altro i percorsi cambiano
Prova a leggere qui
infatti, mi riguardero’ bene il tutto anche se non capisco esattamente dove sta l’errore….grazie cmq……
risolto! senti un ultima cosa … non mi appare per difetto la prima voce…. c’e’ da modificare qualcosa nelle proprieta’? dato che ho smanettato…. anche mettendo editable “false” o “true” ma nulla….
grazie.
Devi utilizzare addItem come da esempio
_root.combo.addItem(itemz);
altrimenti non vengono inseriti i primi valori nella combo
grazie Julius, risolto anche questo. Se fosse utile per qualcuno, l’swf singolarmente funziona perfettamente caricato da un swf madre non appariva la prima voce per difetto del combo. Causa? nell’swf madre’ c’e’ un maschera, quindi attenzione con le maschere e combo.
grazie Julius.
Molto utile questo tutorial solo ho una domanda:
Nel mio combobox ho dei valori che sono più lunghi della larghezza del componente e quindi vengono tagliati.
Io vorrei, mantenendo la larghezza del componente quando è “chiuso” , vari la larghezza solo della tendina che si apre.
Naturalmente mantenendo la larghezza del componente “chiuso” quando si effetuerà la scelta il valore sarà tagliato ma per scegliere sarebbe utile che il valore sia tutto visibile.
E’ possibile fare ciò? E se si come?
Grazie
Salve a tutti!
Ho un combobox (popolato da un xml) che vorrei si caricasse andando direttamente ad una voce specifica.
Vorrei ottenere lo stesso risultato che si ha quando in html si aggiunge al tag il valore “selected”.
Qualcuno saprebbe gentilmente darmi qualche dritta? grazie
Ho trovato il modo:
miocombobox.selectedIndex = miocombobox.length-1;
dove la voce, che mi interessa sia “preselezionata”, si trova al penultimo posto della mia combobox.
Sò che non è di sicuro la soluzione più elegante ma vedo che funziona..
ciao julius,
riesumo questo bel tutorial perchè avrei bisogno che nella comboBox alcune voci fossero in grassetto (a segnalare la presenza di “categorie” all’interno della stessa tendina).
E’ possibile?
Da quanto ho capito con la proprietà fontWeight di setStyle posso settarle il “bold” ma su tutte le voci, invece io vorrei poter scegliere solo su determinate voci..
Grazie infinite!
ciao ciao
savanna ha scritto:
anch’io ho lo stesso problema… non posso utilizzare loadmovienum perchè non riesco a posizionarlo dove vorrei… help me.
marco
@ Julius:
io non sono riuscito a capire… per fare in modo che ci si sposti da un frame all’altro ho letto che nella linea 27 bisogna cambiare con
_root.gotoAndPlay(valoreelemento);
ma non ho capito bene dova va posizionato esattamente, perchè dal sorgente che ho scaricato nella linea 27 mi risulta altro testo del post sopracitato da marchino. Ho seguito tutto passo dopo passo, ma saltero’ qualche passaggio forse per voi ovvio. Se possibile avere ulteriori spiegazioni ne sarei davvero grato.
@ TTno:
Come passare da un frame all’altro:
soluzione
lasciare il file xml intatto
Per quanto riguarda il sorgente flash, creare altri 9 fotogrammi, per averne un totale di 10, ad ognuno di essi inserire il comando stop cancellare il testo dinamico con nome istanza stato e consiglio di inserire una numerazione progressiva o immagini diverse per ogni fotogramma, cosicchè ci possiamo rendere conto dello spostamento tra fotogrammi.
e nel primo fotogramma sostituire il codice con il seguente:
//leggi e carica i dati dal file xml
dati_xml = new XML(); // nuovo oggetto XML
dati_xml.ignoreWhite = true; // elimino gli spazi tra le parole
dati_xml.onLoad = function(success) { //se è stato caricato
if (success) {
// leggo i nodi del file XML
var nodes = this.firstChild.childNodes;
for (var i = 0; i<nodes.length; i++) {
var descrizione = nodes[i].attributes.descrizione;
var valore = nodes[i].attributes.valore;
var itemz = {label:""+descrizione+"", data:""+valore+""};
_root.combo.addItem(itemz);
}
} else {
trace("no load");
}
};
dati_xml.load("list.xml"); // nome del file xml
//fine caricamento
//associa evento al combobox
combolistener = new Object(); // nuoovo oggetto
combolistener.change = function(eventObj) { // funzione cambia
var eventSource = eventObj.target; // impsoto il target
var elemento = eventSource.selectedItem; // impsoto l'elemento
var valoreelemento = elemento.label; // impsoto il valoreelemento
var datavaloreelemento = elemento.data; // impsoto il datavaloreelemento
_root.gotoAndPlay(+datavaloreelemento);
};
combo.addEventListener("change", combolistener); // associo l'evento
soluzione trovata, l’errore stava nella sostituzione della riga 27 (che a me risulta la riga 28)
in ogni caso la sintassi giusta da sostituire è:
_root.gotoAndPlay(+datavaloreelemento);
Saluti e spero di essere stato d’aiuto a qualcun’altro nei miei stessi panni.
Ciao Julius!
mi sto affacciando alla combo box con l’action script 2.0 xchè il 3.0 è troppo complesso x me!
l’ho inserito in una mailform in flash che me la invia su un php e dovrebbe inviarmi la mail compresa di variabili dei testi e variabile della scelta della combobox. ma la var combobox nn mi appare…
mi sono spulciato in giro i forum e ho capito che la combobox nn richiama variabili e dovrei trasformarla in var con l’as..
mi potresti dire come fare?
di seguito ti invio l’as:
//leggi e carica i dati dal file xml
dati_xml = new XML(); // nuovo oggetto XML
dati_xml.ignoreWhite = true; // elimino gli spazi tra le parole
dati_xml.onLoad = function(success) { //se è stato caricato
if (success) {
// leggo i nodi del file XML
var nodes = this.firstChild.childNodes;
for (var i = 0; i<nodes.length; i++) {
var descrizione = nodes[i].attributes.descrizione;
var valore = nodes[i].attributes.valore;
var itemz = {label:""+descrizione+"", data:""+valore+""};
_root.q.combo.addItem(itemz);
}
} else {
trace("no load");
}
};
dati_xml.load("list.xml"); // nome del file xml
//fine caricamento
//associa evento al combobox
combolistener = new Object(); // nuoovo oggetto
combolistener.change = function(eventObj) { // funzione cambia
var eventSource = eventObj.target; // impsoto il target
var elemento = eventSource.selectedItem; // impsoto l'elemento
var valoreelemento = elemento.label; // impsoto il valoreelemento
var datavaloreelemento = elemento.data; // impsoto il datavaloreelemento
};
combo.addEventListener("change", combolistener); // associo l'evento
combo.onChanged = function() {
combo_var = this.value
}
e sul pulsante di invio:
on (press) {
if (sender_name ne "" and sender_email ne "" and sender_surname ne "") {
i = "0";
validmail = 0;
while (Number(i)<=Number(length(sender_email))) {
if (substring(sender_email, i, 1) eq "@") {
validmail = 1;
}
i = Number(i)+1;
}
if (Number(validmail) == 0) {
gotoAndStop("novalidmail");
} else {
loadVariablesNum("mailform.php", 0, "POST");
gotoAndStop("sendt");
}
} else {
gotoAndStop("novalidmail");
}
}
plz.. julius? hai qualche idea?
@ TTno:
ok ho fatto come dici, ma in tutti i frame successivi al 1° non mi ricarica il file xml esterno e quindi la combobox non serve + a nulla…. aggiungendo solo lo script
dati_xml.load("list.xml");
in ogni frame ottengo almeno che me lo carica, ma in ogni modo non funziona + (come è ovvio visto che non ricopio tutto il resto del codice)…..anche copiando tutto il codice in tutti i frame “il compilatore” non mi riscontra errori , ma comunque non mi funziona….HELP!!!!
Come posso fare??? a me serve che resti sempre visibile e utilizzabile, tipo menù a tendina……qualcuno ha una soluzione??? :) grazie!!!
Ciao Julius,
grazie per i validi tutorial come al solito. Ma se io volessi aggiungere altre combobox e far figurare nel campo ‘stato’ una somma tra i vari valori delle singole combobox?