Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 12 di 12
  • livello principiante
Indice lezioni

Quarto esempio

La classe XML con Flash MX
La classe XML con Flash MX
Link copiato negli appunti

Questo ultimo esempio è sviluppato in Flash MX, e si avvale dei metodi del component ListBox.

Il file XML

Il file XML che useremo per l'esempio è strutturato in questo modo:

<?xml
version="1.0" encoding="UTF-8" ?>
<nodo_principale>
  <nodo_figlio_0 attributo1="valore"
attributo2="valore" ....>
    <nodo_figlio_1 attributo1="valore"
..../>
  </nodo_figlio_0>
  <nodo_figlio_0 attributo1="valore"
attributo2="valore" ....>
    <nodo_figlio_1 attributo1="valore"
..../>
  </nodo_figlio_0>
</nodo_principale>

Abbiamo un nodo principale, che contiene una serie di nodi figlio. Ogni nodo figlio ha degli attributi, e a sua volta contiene un nodo figlio anch'esso dotato di attributi.

In particolare, trattandosi di un elenco di automobili, abbiamo:

  • il nodo principale, con nome "elenco"
  • una serie di nodi figlio, con nome "auto", e attributi "modello", "cilindrata" e "foto"
  • ogni nodo "auto" ha un nodo figlio, "info", con gli attributi "casa" (produttrice) e "link"

Contenuto del file XML

Contenuto del file XML

Quindi, per raggiungere:

  • il primo nodo, useremo: this.firstChild
  • l'elenco dei nodi figlio: this.firstChild.childNodes
  • gli attributi del nodo figlio: this.firstChild.childNodes[n].attributes
  • il nodo figlio del singolo nodo figlio: this.firstChild.childNodes[n].firstChild
  • gli attributi di quest'ultimo: ...childNodes[n].firstChild.attributes

Il filmato

  • creiamo un nuovo filmato in Flash MX
  • trasciniamo sullo stage, dal pannello Component, un'istanza del component ListBox
  • assegniamo al component il nome di istanza "lista_lb"
  • nello stesso frame, inseriamo un movieclip vuoto, con nome di istanza "loader"

MovieClip "loader"

MovieClip

  • aggiungiamo, sempre nello stesso frame, 4 campi di testo dinamici, rispettivamente con i nomi di istanza "nome_txt", "modello_txt", "cilindrata_txt", "casa_txt" (assegnabili tramite il pannello "Properties", come mostrato dalla figura).

Nome di istanza del campo di testo

Nome di istanza del campo di testo

Il codice del caricamento

Allo stesso frame in cui abbiamo inserito i campi di testo e il component ListBox, associamo uno script con la seguente struttura:

// creazione dell'istanza della Classe XML
dati_xml = new XML();
// settaggio per ignorare gli spazi vuoti nel file XML
dati_xml.ignoreWhite = true;
/* salvataggio in una variabile del riferimento
alla timeline in cui giace lo script */
dati_xml.path = this;
/* definizione della funzione da invocare
al caricamento completo delle variabili */
dati_xml.onLoad = function(success)
{
    // se il caricamento è andato a buon fine
    if(success){
        // script di inserimento dati
        // • popolamento del ListBox
        // • definizione del changeHandler del ListBox
        // • selezione forzata del primo elemento
    // altrimenti
    } else
{
        // script di escape
        // • messaggio di errore per l'utente
    }
};
// caricamento dati
dati_xml.load("lista.xml");

All'interno della funzione associata all'evento onLoad, prevedendo il caso in cui il file non venga caricato correttamente (e quindi quando "success" è falsa), inseriamo il codice per mostrare un messaggio informativo nel ListBox, e per disabilitarne la selezione.

// script di escape
this.path.lista_lb.addItem("lista non disponibile");
this.path.lista_lb.setEnabled(false);

Al contrario, per il caso in cui il caricamento sia avvenuto in modo corretto, inseriamo il codice che sviluppa i dati raccolti e che permette il funzionamento del ListBox:

var nodes = this.firstChild.childNodes;
for(var i = 0; i < nodes.length; i++){
  var label = nodes[i].attributes.nome;
  var data = {dati:nodes[i].attributes, info:nodes[i].firstChild.attributes};
  this.path.lista_lb.addItemAt(i, label, data);
}
this.path.lista_lb.setChangeHandler("aggiorna");
this.path.aggiorna = function(component)
{
var item = component.getSelectedItem().data;
  loader_mc.loadMovie(item.dati.foto);
  nome_txt.text = " " + item.dati.nome;
  modello_txt.text = " " + item.dati.modello;
  cilindrata_txt.text = " cm³ " + item.dati.cilindrata;
  casa_txt.html = true;
  casa_txt.htmlText = "<font color='#006699'><a href='" + item.info.link + "'
target='_blank'> " + item.info.casa + "</a></font>";
};
this.path.lista_lb.setSelectedIndex(0);

Commentato:

/* salviamo nella variabile "nodes" un riferimento
all'elenco dei nodi figlio principali */
var nodes = this.firstChild.childNodes;
// con un ciclo for a tante iterazioni quanti sono i nodi figlio
for(var i = 0; i < nodes.length; i++){
  /* creiamo la variabile temporanea "label", nella quale
  inseriamo il contenuto dell'attributo "nome" del nodo
  figlio con indice "i" */
  var label = nodes[i].attributes.nome;
  /* creiamo la variabile temporanea "data": si tratta di
  un oggetto, con due proprietà, "dati" e "info". la prima
  proprietà corrisponde all'array associativo "attributes"
  del nodo figlio indicato. la seconda è l'array associativo
  "attributes" del singolo nodo figlio del nodo figlio indicato */
  var data = {dati:nodes[i].attributes, info:nodes[i].firstChild.attributes};
  /* aggiungiamo al ListBox, raggiungibile tramite la variabile "path"
  che ne serba il percorso, un elemento in posizione "i", la cui etichetta
  e i dati associati sono indicati dalle due variabili appena create */
  this.path.lista_lb.addItemAt(i, label, data);
}
/* indichiamo il nome della funzione che il ListBox dovrà
richiamare quando viene cambiato l'elemento selezionato */
this.path.lista_lb.setChangeHandler("aggiorna");
/* definiamo la funzione che verrà chiamata al cambiamento
di stato del ListBox. la funzione riceve il parametro "component"
cioè il riferimento al ListBox stesso */
this.path.aggiorna = function(component)
{
  /* creiamo la variabile temporanea "item", contenente
  i dati associati all'elemento selezionato nel ListBox */
  var item = component.getSelectedItem().data;
  /* carichiamo nel movieclip vuoto "loader" l'immagine
  il cui nome e percorso sono indicati nella proprietà
  "foto" dell'oggetto "dati", proprietà di "item": si tratta
  dell'attributo "foto" del nodo figlio */
  loader_mc.loadMovie(item.dati.foto);
  // riempiamo i campi di testo con gli altri dati
  nome_txt.text = " " + item.dati.nome;
  modello_txt.text = " " + item.dati.modello;
  cilindrata_txt.text = " cm³ " + item.dati.cilindrata;
  // abilitiamo l'interpretazione html per il campo di testo "casa_txt"
  casa_txt.html = true;
  // creiamo un link al sito della casa produttrice, modificandone il colore
con i relativi tag html
  casa_txt.htmlText = "<font color='#006699'><a href='" + item.info.link + "'
target='_blank'> " + item.info.casa + "</a></font>";
};
// forziamo la selezione del primo elemento del ListBox
this.path.lista_lb.setSelectedIndex(0);

Scarica l'esempio

Ti consigliamo anche