This is a discussion on Popolare un ComboBox da un file XML con Flash CS3 within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Vi è mai capitato di dover visualizzare una lista di dati in cui ogni dato deve essere selezionabile e visualizzare a ...
Vi è mai capitato di dover visualizzare una lista di dati in cui ogni dato deve essere selezionabile e visualizzare a sua volta una lista ?
Ebbene, il componente ComboBox è quello che fa al vostro caso :)
In questo esempio, inserisco in un ComboBox tutte le square di calcio di serie A e selezionandone una, viene visualizzata la lista dei giocatori appartenente a quella squadra in un componente List.
Per popolare questi 2 componenti, prendo dei dati da un file XML esterno ed utilizzo un Array bidimensionale con Actionscript 3.0 .
Vediamo come...
Creo un FLA che salvo con nome ' combo.fla ' .
Trascino sullo stage:
un ComboBox che chiamo ' squadre_cb '
un List che chiamo ' giocatori_list '
creo un campo di testo dinamico e lo chiamo ' num_txt ' .
Creo la Document Class, un file AS che salvo con nome ' Combo.as ', e la implemento in questo modo:
Analizziamo il codice della class Combo:
dichiaro le variabili che mi servono
PS i due Array sono statici perchè così posso richiamarli dalla classe LoadingXML ( una volta finito di caricare il file XML ) in questo modo: Combo.squadre_array e Combo.giocatori_array
private var loading_xml:LoadingXML;
public static var squadre_array:Array;
public static var giocatori_array:Array;
col metodo init inizializzo i 2 Array e posiziono i miei oggetti sullo stage
squadre_array=new Array();
giocatori_array=new Array();
squadre_cb.move(30,30);
squadre_cb.width=100;
giocatori_list.move(180,squadre_cb.y);
chiamo il metodo loadXML in cui istanzio la classe LoadingXML passandogli this,che non è altro che la _root che si utilizzava in Actionscript 2.0
loading_xml=new LoadingXML(this);
A questo punto passiamo ad analizzare cosa succede nella classe LoadingXML
dichiaro una variabile di tipo MovieClip chiamata ' my_root '
private var my_root:MovieClip;
una volta caricato l' XML , apro un ciclo che ha come lunghezza il numero dei Childs del mio XML
var n:int=int(node.childNodes.length);
for(var i:int=0;i < n;i++)
al cui interno chiamo Combo.squadre_array ( in quanto è una proprietà statica e quindi non necessito di istanziare la classe Combo da questa classe per poter chiamare quell' Array ) e inserisco il valore dell' attributo ' nome ' del nodo ' squadra 'del file XML
Combo.squadre_array.push(node.childNodes[i].attributes['nome']);
creo una variabile di tipo String, la chiamo ' giocatori ' e gli assegno il valore del nodo ' squadra ' del file XML
var giocatori:String=node.childNodes[i].firstChild.nodeValue;
creo un nuovo Array che chiamo ' my_array '
var array:Array=new Array();
ora ho una stringa all' interno della variabile giocatori che è composta da tutti i nomi dei giocatori separati da una virgola, quindi utilizzo il metodo split della classe String per ' trasformare ' la stringa in un Array dicendo a Flash che il separatore di ogni valore è una virgola
array=giocatori.split(',');
adesso attenzione ! inserisco in Combo.giocatori_array ( chiaramente all' indice con numero uguale all' iterazione del ciclo che è in esecuzione ) il mio nuovo Array ( ' my_array' ) e quindi Combo.giocatori_array diventa un Array bidimensionale in quanto ogni suo indice non contiene un vlaore unico ma contiene un altro Array
Combo.giocatori_array.push(array);
Ora che abbiamo popolato gli Arrays della Classe Combo, chiamo un metodo della stessa classe Combo che si chiama initCombo e non è statico, ciò significa che devo chiamare quel metodo dall' istanza della calsse Combo che in questo caso è la variabile my_root che abbiamo dichiarato
my_root.initCombo();
Nel metodo initCombo della classe Combo cosa faccio:
popolo il nostro ComboBox utilizzando il metodo della classe ComboBox: addItem
for(var i:int=0;i < squadre_array.length;i++)
{
squadre_cb.addItem({label:squadre_array[i],data:i.toString()});
}
aggiungo un listener inascolto sul ComboBox in modo che ogni voltache viene selezionata una nuova voce chiama il metodo selezione passandogli l' ID della voce selezionata
squadre_cb.addEventListener(Event.CHANGE,selezione );
il metodo selezione :
crea una variabile di tipo DataProvider
var dp:DataProvider=new DataProvider();
creo una variabile numerica e gli assegno come valore la lunghezza dell' Array che è all'interno dell' Array giocatori_array all' indice del numero passatomi al momento della selezione della voce nel ComboBox
var rows:int=giocatori_array[n].length;
dico al componente List quanti spazi deve avere
giocatori_list.rowCount=rows;
apro un ciclo e popolo il DataProvider utilizzando il suo metodo addItem
for(var i:int;i < rows;i++)
{
dp.addItem({label:giocatori_array[n][i]});
}
passo alla proprietà dataProvider del componente List la variabile DataProvider
giocatori_list.dataProvider=dp;
dico al campodi testo di scrivere il numero massimodi giocatori che la squadra ha ( quindi il valore della variabile ' rows ' )
num_txt.text='numero giocatori: '+rows.toString();
Ok, ho una pagina .asp (e quella sta li' tranquilla )
Alla base di questa vorrei inserire un .swf cosi fatto:
Una combobox (nella quale vorrei mettere circa 40 voci) che chiama diversi (lo stesso numero) swf sullo stesso stage (questi sono semplici swf con testo static e datagrid popolati leggendo xml files?.e come fare questi l?ho appreso?grazie a questi tutorial) Come posso inserire questi swf nel mio swf principale?
c?e? una componente List (e forse a me servirebbe una TextArea con tag per caricare gli swf?.non so, sto semplicemente ipotizzando)
entrambi I components dell?esempio leggono dallo stesso xml mentre gli swf che voglio chiamare leggono da altri (?popolosi?) xml files.
In 2 parole il mio problema e? chiamare da una combo, swf che mi si inseriscono sullo stesso stage.
(la soluzione sporca sporca sarebbe crearmi una pulsantiera come questa ancora pulsanti
inserire 40 textarea sullo stage che mi caricano gli swf...ma credo che agli orecchi di un programmatore questo suoni come una bestemmia e mi piacerebbe provare a fare qualcosa di piu' pulito )
Concettualmente, come devo implementare questo schema mentale?
Come posso modificare l'esempio del popolare una combo da xml per poterlo far girare come serve a me?
M'e' sfuggito qualche esempio che fa al caso mio?
Re: Popolare un ComboBox da un file XML con Flash CS3
Ciao Mitch,
in sostanza una volta che hai popolato il combobox devi solo creare delle logiche per caricare l' SWF corrispettivo alla voce selezionata del combobox.
Re: Popolare un ComboBox da un file XML con Flash CS3
dannazione!!!...ci sto impazzendo.
so caricare url esterni in nuove pagine con una combo
riesco a capire come caricare swf esterni dentro uno stage
ma quando si tratta dell'interazione dei due...IMPAZZISCO!!!
vorrei farlo con un xml cosi' impostato
Code:
(partendo dal presupposto che gli swf stanno nella stessa cartella)
in modo tale che la combo mi legge l'attributo nome di ogni nodo mettendolo nella label
e il loader quello url ma mi sono accorto che per me questa e' roba da extraterrestri!!
l' xml deve essere uno?...penso di si e sia la combo che il loader leggono da quello
quanti array devo usare quando popolo una combo in modo da poter usarla con un loader? due no?
in uno mi ci vanno i nomi dei nodi e nell'atro gli url dei swf.
provo a farlo a mano, riempendo un array impostando label quella che voglio
e data l'url dell'esternal swf (come nel tuttorial piu_DC)....ma a meta' codice mi perdo completamente!!!
prova ad usare UILoader...ma non c'e' versi perche' non riesco ad attaccarlo alla combo!!!
sto cercando di mescolare un paio di tutorial trovati qui', l'help di flash e un altro
tutorial trovato altrove...troppa roba??...damn it!!!....nessuno di questi fa quello
che voglio e quando mixo faccio un gran casino!!!
nessuno ha mai caricato swf esterni con combo? perche' come integrare le 2 cose
mi sta finendo il fegato!!!
Re: Popolare un ComboBox da un file XML con Flash CS3
grrrrrrrrrrrrrrrrrrrrr!!!
HTML Code:
<?xml version="1.0" encoding="UTF-8"?><SWF_EXT><item id="0" url="primo.swf" nome="questo e' il primo" /item><item id="1" url="secondo.swf" nome="questo e' il secondo" /item><item id="2" url="terzo.swf" nome="questo e' il terzo" /item></SWF_EXT>