Flash CS3 - Flash CS4

Free tutorials and scripts for all.
Actionscript 3.0

Popolare un ComboBox da un file XML con Flash CS3

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


Go Back   Forum Flash CS3 Flash CS4 > Flash CS3 e Actionscript 3.0 > Articoli e tutorials

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  1 links from elsewhere to this Post. Click to view. #1 (permalink)  
Old 20-09-07, 09:40
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,486
Rep Power: 6
Flep is on a distinguished road
Popolare un ComboBox da un file XML con Flash CS3

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:
Code:
package
{
	import flash.display.MovieClip;
	import flash.text.TextField;
	import fl.controls.ComboBox;
	import fl.data.DataProvider;
	import flash.events.Event;
	import flash.ui.ContextMenu;
	import flash.ui.ContextMenuItem;
	import flash.events.ContextMenuEvent;
	import flash.net.URLRequest;
	import flash.net.navigateToURL;
	
	public class Combo extends MovieClip
	{
		private var loading_xml:LoadingXML;
		
		public static var squadre_array:Array;
		public static var giocatori_array:Array;
		
		public function Combo()
		{
			initMenu();
			init();
			loadXML();
		}
		
		private function init():void
		{
			squadre_array=new Array();
			giocatori_array=new Array();
			
			squadre_cb.move(30,30);
			squadre_cb.width=100;
			
			giocatori_list.move(180,squadre_cb.y);
		}
		
		private function loadXML():void
		{
			loading_xml=new LoadingXML(this);
		}
		
		public function initCombo():void
		{
			for(var i:int=0;i < squadre_array.length;i++)
			{
				squadre_cb.addItem({label:squadre_array[i],data:i.toString()});
			}
			squadre_cb.addEventListener(Event.CHANGE,selezione);
			initList(0);
		}
		
		private function selezione(event:Event):void 
		{
			initList(squadre_cb.selectedItem.data);
		}
		
		private function initList(n:int):void
		{
			var dp:DataProvider=new DataProvider();
			var rows:int=giocatori_array[n].length;
			giocatori_list.rowCount=rows;
			for(var i:int;i < rows;i++)
			{
				dp.addItem({label:giocatori_array[n][i]});
			}
			giocatori_list.dataProvider=dp;
			num_txt.text='numero giocatori: '+rows.toString();
		}
		
		// NON rimuovere per favore !
		public function initMenu():void
		{
			var etichetta:String='© FlepStudio.org';
			var cm:ContextMenu=new ContextMenu();
			var item:ContextMenuItem=new ContextMenuItem(etichetta);
			cm.hideBuiltInItems();
			cm.customItems.push(item);
			item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,itemHandler1);
			this.contextMenu=cm;
		}
		private function itemHandler1(event:ContextMenuEvent):void
		{
			var url:String='http://www.flepstudio.org/';
			var request:URLRequest=new URLRequest(url);
			navigateToURL(request,'_parent');
		}
	}
}
Creo la classe che carica il file XML ( un file AS che salvo con nome LoadingXML ):
Code:
package
{
	import flash.display.MovieClip;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.xml.*;
	
	public class LoadingXML extends XMLDocument
	{
		private var my_root:MovieClip;
		
		public function LoadingXML(m:MovieClip)
		{
			my_root=m;
			this.loadXML();
		}
		private function loadXML():void
		{
			var loader:URLLoader=new URLLoader();
			loader.addEventListener(Event.COMPLETE,completeHandler);
			
			var request:URLRequest=new URLRequest('http://www.flepstudio.org/swf/squadre.xml');
			try 
			{
				loader.load(request);
			} 
			catch(error:Error) 
			{
				trace('Impossibile caricare il documento.');
			}
		}
		private function completeHandler(event:Event):void
		{
			var loader:URLLoader=URLLoader(event.target);
			var result:XML=new XML(loader.data);
			var myXML:XMLDocument=new XMLDocument();
			myXML.ignoreWhite=true;
			myXML.parseXML(result.toXMLString());
			var node:XMLNode=myXML.firstChild;
			var n:int=int(node.childNodes.length);
			for(var i:int=0;i < n;i++)
			{
				Combo.squadre_array.push(node.childNodes[i].attributes['nome']);
				var giocatori:String=node.childNodes[i].firstChild.nodeValue;
				var array:Array=new Array();
				array=giocatori.split(',');
				Combo.giocatori_array.push(array);
			}
			my_root.initCombo();
		}
	}
}


Clicca QUI per vedere il file XML.


 


Questo è il risultato:

Risultato:











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();

Allego i files sorgente:
Attached Files
File Type: zip Combo.zip (782.6 KB, 45 views)

__________________

 


I recommend: Essential Actionscript 3.0

- Non rispondo ai messaggi privati con domande tecniche. Apri una discussione sul forum !
- I do not reply technicians pvt messages. Open a thread !

Last edited by Flep; 04-06-08 at 23:27..
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #2 (permalink)  
Old 04-03-08, 19:07
Junior Member
 
Join Date: Jan 2008
Posts: 17
Rep Power: 0
mitch77 is on a distinguished road
Chiamare swf esterni da combobox

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?


Ho provato a studiarmi Popolare un ComboBox da un file XML con Flash CS3
ma il non e? proprio il mio caso perche?:

  1. c?e? una componente List (e forse a me servirebbe una TextArea con tag per caricare gli swf?.non so, sto semplicemente ipotizzando)
  2. 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?



grazie a tutti
mitch.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #3 (permalink)  
Old 06-03-08, 04:14
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,486
Rep Power: 6
Flep is on a distinguished road
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.

Ti consiglio di usare Event.ADDED_TO_STAGE negli SWF che crei e che devi poi caricare.
Un esempio di ADDED_TO_STAGE è quì:
http://www.flepstudio.org/forum/acti...ent-class.html
__________________

 


I recommend: Essential Actionscript 3.0

- Non rispondo ai messaggi privati con domande tecniche. Apri una discussione sul forum !
- I do not reply technicians pvt messages. Open a thread !
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #4 (permalink)  
Old 06-03-08, 05:46
Junior Member
 
Join Date: Jan 2008
Posts: 17
Rep Power: 0
mitch77 is on a distinguished road
Re: Popolare un ComboBox da un file XML con Flash CS3

Si, me n'ero accorto (l'idea di usare il tag img per la textarea lasciava un po' a desiderare).

Mi sono scaricato questo e me lo studio:

Creare un sito caricando SWF esterni con Flash CS3

e poi anche quello che mi hai consigliato....vediamo se durante 'sto spring break ci levo le gambe....a risentirci (presto credo ).
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #5 (permalink)  
Old 06-03-08, 18:48
Junior Member
 
Join Date: Jan 2008
Posts: 17
Rep Power: 0
mitch77 is on a distinguished road
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!!!

mitch
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

Flash Multi Gallery
  #6 (permalink)  
Old 06-03-08, 18:50
Junior Member
 
Join Date: Jan 2008
Posts: 17
Rep Power: 0
mitch77 is on a distinguished road
Re: Popolare un ComboBox da un file XML con Flash CS3

..scusate non c'era xml sopra






Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #7 (permalink)  
Old 06-03-08, 18:52
Junior Member
 
Join Date: Jan 2008
Posts: 17
Rep Power: 0
mitch77 is on a distinguished road
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>
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #8 (permalink)  
Old 11-03-08, 01:28
Junior Member
 
Join Date: Jan 2008
Posts: 17
Rep Power: 0
mitch77 is on a distinguished road
Re: Popolare un ComboBox da un file XML con Flash CS3

Allora..ci sono riuscito...quasi:
sullo stage principale ho una combo (cb) e un dynamic text (loadingSWFLbl).

sulla timeline ho scritto:

Code:
import fl.data.DataProvider;

    cb.addEventListener(Event.CHANGE, changeSWF);
    cb.move (10, 10);
    cb.dropdownWidth = 150;
    cb.width = 150; 

    cb.dataProvider = new DataProvider();
    cb.addItem({label: "Questo e' il primo swf", data: "primo.swf"});
    cb.addItem({label: "Questo e' il secondo swf", data: "secondo.swf"});
    cb.addItem({label: "Questo e' il terzo swf", data: "terzo.swf"});

    function swfListener(event:Event):void 
        {
            loadingSWFLbl.visible = false;
        }


    var swfLoader:Loader = new Loader();
    swfLoader.x = 300;
    swfLoader.y = 20;
    swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfListener);
    addChild(swfLoader);


    cb.selectedIndex = 0;
    swfLoader.load(new URLRequest(cb.selectedItem.data));


    function changeSWF(event:Event):void 
        {
            loadingSWFLbl.visible = true;
            swfLoader.load(new URLRequest(cb.selectedItem.data));
        }
e per vedere se andava ho creato 3 semplici swf senza codice e li ho messi nella
stessa cartella...e funge!!

quando nella stessa cartella ci metto l' swf che mi popola un datagrid leggendo da xml
(tutorial riadattato da questo forum)...mi da questo errore:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Main/init()
at Main()

il datagrid da solo va:

Code:
package
{
    import flash.display.MovieClip;
    import fl.controls.DataGrid;
    import fl.controls.ScrollPolicy;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.TextFieldAutoSize;
    
    public class Grid extends MovieClip
    {
        private var xml:LoadingXML;
        
        public var objects_array:Array;
        public var colonne_array:Array;
        
        public var titolo:String;
        
        private var titolo_txt:TextField;
        
        public function Grid()
        {
            init();
            loadXML();
        }
        
        private function init():void
        {
            objects_array=new Array();
            colonne_array=new Array();
        }
        
        private function loadXML():void
        {
            xml=new LoadingXML(this);
        }
        
        public function creaTitolo():void
        {
            titolo_txt=createField(26,'Century Gothic');
            addChild(titolo_txt);
            titolo_txt.text=titolo;
            titolo_txt.x=stage.stageWidth/2-titolo_txt.width/2;
        }
        
        private function createField(n:Number,f:String):TextField
        {
            var field:TextField=new TextField();
            field.autoSize=TextFieldAutoSize.LEFT;
            field.selectable=false;
            field.embedFonts=true;
            field.defaultTextFormat=getFormat(n,f);
            return(field);
        }
        
        private function getFormat(n:Number,f:String):TextFormat
        {
            var tf:TextFormat=new TextFormat();
            tf.font=f;
            tf.size=n;
            tf.bold=true;
            tf.letterSpacing=0;
            tf.color=0x666666;
            return(tf);
        }
        
        public function initDataGrid():void
        {
            dg.move(25,50);
            dg.width=550;
            dg.rowCount=10;
            dg.columns=colonne_array;
            dg.verticalScrollPolicy=ScrollPolicy.ON;
            for(var i:int=0;i < objects_array.length;i++)
            {
                dg.addItem(objects_array[i]);
            }
        }
    }
}
what's wrong with me?????
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #9 (permalink)  
Old 11-03-08, 04:03
Junior Member
 
Join Date: Jan 2008
Posts: 17
Rep Power: 0
mitch77 is on a distinguished road
Re: Popolare un ComboBox da un file XML con Flash CS3

ok, ho aggiunto

Code:
addEventListener(Event.ADDED_TO_STAGE,init);
e
Code:
removeEventListener(Event.ADDED_TO_STAGE,init);
nell' swf che popola il datagrid.
qualsiasi cosa compilo (grid o combo) mi da questo errore

ArgumentError:
Error #1063: Argument count mismatch on Grid/init(). Expected 0, got 1.

...MA MI CARICA L'SWF!!...e anche pubblicandolo funziona!

ora si che sono fuso
..qualcuno sa dirmi qualcosa a riguardo di questo errore?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #10 (permalink)  
Old 15-03-08, 06:21
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,486
Rep Power: 6
Flep is on a distinguished road
Re: Popolare un ComboBox da un file XML con Flash CS3

Nella funzione init, devi aggiungere il parametro in ricezione.
Dato che la chiami da un listener di Event.ADDED_TO_STAGE, init diventa:

function init(evt:Event):void
__________________

 


I recommend: Essential Actionscript 3.0

- Non rispondo ai messaggi privati con domande tecniche. Apri una discussione sul forum !
- I do not reply technicians pvt messages. Open a thread !
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

Reply

Bookmarks

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is On
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump

Similar Threads

Thread Thread Starter Forum Replies Last Post
Actionscript 3 Popolare un array multidimensionale nextframe Actionscript 3.0 base 2 07-08-08 16:48
How to populate a ComboBox from an XML file with Flash CS3 Flep Tutorials 11 05-08-08 09:09
loading external text file in nested flash file angel3m HELP free utilities 0 16-07-08 22:18
Popolare un DataGrid da file XML Flep Articoli e tutorials 2 08-05-08 09:30
combobox in AS3 acca2o Actionscript 3.0 base 1 21-04-08 09:07


All times are GMT. The time now is 12:35.


Powered by vBulletin versione 3.7.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0 RC4
Forum SiteMap


FlepStudio
by Filippo Lughi
P.IVA 03605860406