ComboBox Flash

- Letture: 3.018

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

combobox.jpg

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

  • descrizione: Label della ComboBox
  • valore: il valore da assegnare
  • <?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>

    Stratega, Docente, Speaker con più di 12 anni di esperienza in strategie creative multicanale. Oggi sono Managing Partner di ThinkingHat, Innovation Studio specializzato in tecnologie emergenti per aziende e brand audaci.

    42 Commenti

    1. ciao

      Ma se invece del valore vorrei mettere gotoandplay ad un frame si puo fare?

    2. 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.

    3. 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

    4. 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

    5. 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…

    6. 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?

    7. 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?

    8. emanuele

      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….

    9. Ciao julius,
      è possibile associare a ogni pulsante del combovox un’azione in modo da spostarsi all’interno del filmato flash tipo gotoAndPlay(1);

    10. 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

    11. 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

    12. 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

    13. Marchino

      Linea 27 dove trovi

      stato.text = “Hai premuto “+valoreelemento+” il suo valore è “+datavaloreelemento;

      inserisci

      _root.gotoAndPlay(valoreelemento);

    14. “Hai premuto “+_root.gotoAndPlay(valoreelemento)+” il suo valore è “+datavaloreelemento

      ho messo cosi e mi da valore indefinito nell xml ho messo

      grazias

    15. 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);

    16. 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…..

    17. 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

    18. infatti, mi riguardero’ bene il tutto anche se non capisco esattamente dove sta l’errore….grazie cmq……

    19. 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.

    20. Devi utilizzare addItem come da esempio

      _root.combo.addItem(itemz);

      altrimenti non vengono inseriti i primi valori nella combo

    21. 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.

    22. 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

    23. 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

    24. 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..

    25. 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

    26. savanna ha scritto:

      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.

      anch’io ho lo stesso problema… non posso utilizzare loadmovienum perchè non riesco a posizionarlo dove vorrei… help me.

      marco

    27. @ 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.

    28. @ 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

    29. 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.

    30. 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");
      }
      }

    31. Makkosò

      @ 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!!!

    32. 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?

    Commenti