Follow us on...
Follow us on Twitter Follow us on Facebook
Registrazione
Risultati da 1 a 5 di 5
  1. #1
    Data Registrazione
    May 2012
    Messaggi
    2

    Question Ritornare un oggetto: lettura Xml per utilizzo in classi esterne.

    Buongiorno a tutti

    Ho un grande problema perchè non riesco a capire in che modo posso richiamare un oggetto modificato in una classe per poi utilizzarlo in altre classi.
    Per fare un po' di pratica ho scritto questo pezzo di codice per leggere un XML.
    Codice:
    package{
    
    	import flash.display.Loader;
    	import flash.display.Sprite;
    	import flash.net.URLLoader;
    	import flash.net.URLRequest;
    	import flash.xml.XMLDocument;
    	
    public class xmlImages extends Sprite{
    		
    		
    		
    		public function xmlImages(){
    			super();
    		}
    		
    		public function getXml(radix:String):XML{
    			var urlReq:URLRequest = new URLRequest(radix);
    			var loader:URLLoader = new URLLoader();
    			loader.load(urlReq);				
    			var _xml:XML = new XML(loader.data);
    			_xml.ignoreWhite=true;
    			return _xml;
    			
    		}
    		
    		
    		public function getArray(theXml:XML):Array{
    			var i:int=0;
    			
    			
    			//for(var r:int=0; r<theXml.image.lenght(); r++){
    				//trace(theXml.image[r]);
    			//}
    			var _imagesArray:Array= new Array();;
    			for each (var images:XML in theXml.image) {
    				
    				_imagesArray[i]=images;
    				//questi trace non mi serve ma l'ho inserito per capire se stampava qualcosa. Ho constatato che non entra in questo ciclo.
                                    trace("sono visibile");
                                    trace(images);
    				i++;
    			}
    			return _imagesArray;
    		}
    	 }
    }
    Io richiamo il tutto da una classe esterna in questo modo:
    Codice:
    import xmlImages;
    
    
    var readXml:xmlImages = new xmlImages();
    var newXML:XML= readXml.getXml("images.xml");
    var newAr:Array = readXml.getArray(newXML);
    e il file che devo leggere è:
    images.xml
    Codice:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <images>
    	<image>images/img1.jpg</image>
    	<image>images/img2.jpg</image>
    	<image>images/img3.jpg</image>
    	<image>images/img4.jpg</image>
    	<image>images/img5.jpg</image>
    	<image>images/img6.jpg</image>
    </images>
    Dalle guide viste in rete ho notato che gli esempi vengono fatti con l'addEventListner ma a me serve che la classe xmlImages abbia un metodo che mi ritorni un oggetto XML per utilizzarlo fuori, e cmq non devo fare dei "trace", ho bisogno di restituire l'Xml tramite return.
    Come faccio?

    Grazie

  2. #2
    Data Registrazione
    Sep 2010
    Messaggi
    483

    Predefinito

    Ciao,
    penso che un possibile approccio per una soluzione alla tua domanda sia creare una classe che dispacci un evento quando quest'ultima ha processato il file xml e creato un array contenente i dati che servono.

    In sostanza la classe riempie una variabile pubblica di tipo array contenente i dati e dispaccia ad esempio un evento tipo Event.COMPLETE
    Quando importi la classe aggiungi un listener per rilevare l'evento e poi accedi alla variabile pubblica contenete i dati.

  3. #3
    Data Registrazione
    May 2012
    Messaggi
    2

    Predefinito

    Ciao mrphp,

    e grazie per la tua risposta.

    Non so se ho ben capito quello che mi hai detto.
    Ho fatto questa prova:


    Codice:
    package{
    
    	import flash.display.Loader;
    	import flash.display.Sprite;
    	import flash.net.URLLoader;
    	import flash.net.URLRequest;
    	import flash.xml.XMLDocument;
    	
    public class xmlImages extends Sprite{
    		
    		public var myArray:Array= new Array();
    		
    		public function xmlImages(){
    			super();
    		}
    		
    		public function getXml(radix:String):void{     //HO MODIFICATO IN "VOID" 
    			var urlReq:URLRequest = new URLRequest(radix);
    			var loader:URLLoader = new URLLoader();
    			loader.load(urlReq);	
    			loader.addEventListener(Event.COMPLETE, handleXMLloaded);
    
                            function handleXMLloaded(e:Event):void {
    			        var _xml:XML = new XML(loader.data);
    			        _xml.ignoreWhite=true;
    			        var i:int=0;
                                    for each (var images:XML in _xml.image) {
    						trace(images);   // OK
    						myArray[i]=images;   // OK - L'ARRAY VIENE MODIFICATO
    						i++;
    					}
                                    for(var c=0; c<myArray.length; c++){       //QUI OK - L'ARRAY VIENE VISTO
                        	              trace(myArray[c]);    
    			        }
    			}
    			for(var c=0; c<myArray.length; c++){    // NON OK - L'ARRAY NON VIENE VISTO -
                   	               trace(myArray[c]);                         // NON MI DA ERRORE MA L'ARRAY E' VUOTO
                            // COME FACCIO A FAR VEDERE L'ARRAY ESTERNAMENTE A QUESTA FUNZIONE???
                            // EPPURE HO DICHIARATO PUBLIC L'ARRAY DIRETTAMENTE NELLA CLASSE
    		}
    	}
    }
    }
    Ma questo problema di visibilità mi sembra strano.

    Non so se questo rispecchia quello che mi hai suggerito.
    Diversamente, ho pensato di mettere una qualche specie di return array alla funzione handleXMLloaded,
    ma come faccio a farmi restituire un qualcosa dall'handleXMLloaded, visto che la richiamo dal loader.addEventListener(Event.COMPLETE, handleXMLloaded)

  4. #4
    Data Registrazione
    Sep 2010
    Messaggi
    483

    Predefinito

    Il problema non è vedere l'array, infatti per vederlo basterebbe accedere alla proprietà della classe, ad esempio:

    Codice:
    import xmlImages;
    
    var readXml:xmlImages = new xmlImages();
    
    trace(readXml.myArray); // accedo all' array definito come proprietà  pubblica della classe readXml
    ma quando rilevare il contenuto di questa proprietà !!!

    Per questo motivo ti ho proposto come soluzione il Dispatch di un evento che potrà essere rilevato quando il metodo preposto al riempimento dell'array nella tua classe ha completato la procedura di caricamento dati.

  5. #5
    Data Registrazione
    Oct 2005
    Messaggi
    181

    Predefinito

    In questo caso ti conviene crearti un evento personalizzato (una classe che estende Event) per poi farlo dispacciare dalla tua xmlImages passando come parametro quello che vuoi (nel tuo caso l'array mi pare di capire).
    Esempio:

    Codice:
    package
    {
    	import flash.events.Event;
    	
    	public class XMLImagesEvent extends Event
    	{
    		public static const LOAD_COMPLETE:String = "loadComplete";
    		public var imageArray:Array;
    		
    		/**
    		 * Constructor  
    		 */
    		public function XMLImagesEvent(type:String, a:Array) 
    		{
    			super(type);
    			imageArray = a;
    		}
    		
    		/** @inheritDoc **/
    		public override function clone():Event 
    		{
    			return new XMLImagesEvent(type, imageArray);
    		}
    	}
    }
    Poi semplicemente dal tuo main devi ascoltare questo evento

    Codice:
    import xmlImages;
    
    var readXml:xmlImages = new xmlImages();
    readXml.addEventListener(XMLImagesEvent.LOAD_COMPLETE, handleXMLloaded);
    // ho cambiato il nome del metodo, così ha più senso
    readXml.loadXML("images.xml");
    
    private function handleXMLloaded(e:XMLImagesEvent):void
    {
            // qui mi vado a prendere l'array
    	trace(e.imageArray);
    }
    Infine l'evento lo dispacci una volta caricato l'xml nella tua classe:

    Codice:
    package
    {
    
    	import flash.display.Loader;
    	import flash.display.Sprite;
    	import flash.net.URLLoader;
    	import flash.net.URLRequest;
    	import flash.xml.XMLDocument;
    	
    	public class xmlImages extends Sprite
    	{
    		public function xmlImages(){
    			super();
    		}
    		
    		public function getXml(radix:String):void
    		{
    			var urlReq:URLRequest = new URLRequest(radix);
    			var loader:URLLoader = new URLLoader();
    			loader.addEventListener(Event.COMPLETE, handleXMLloaded);
    			loader.load(urlReq);
    		}
    		
    		private function handleXMLloaded(e:Event):void 
    		{
    			var _xml:XML = new XML(loader.data);
    			_xml.ignoreWhite = true;
    			var i:int = 0;
    			
    			var myArray:Array = new Array();
    			
    			for each (var images:XML in _xml.image) {
    				trace(images);   // OK
    				myArray[i] = images;   // OK - L'ARRAY VIENE MODIFICATO
    				i++;
    			}
    			
    			dispatchEvent(new XMLImagesEvent(XMLImagesEvent.LOAD_COMPLETE, myArray);
    		}
    	}
    }
    Scritto al volo dall'ufficio, cmq dovrebbe funzionare.
    Adobe Flash CS3 Certified Expert

 

 

Tag per Questa Discussione

Segnalibri

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •