Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1

    [as3] rendere visibile xml esterno a tutto il codice

    Ho una prova di lettura di un xml esterno che non mi funziona.
    Il codice della classe documento è:
    codice:
    package {
    	import flash.display.Sprite;
    	import flash.net.URLLoader;
    	import flash.net.URLRequest;
    	import flash.events.Event;
    	
    	public class prova_5 extends Sprite {
    		function prova_5():void {
    			importa();
    		}
    		function importa():void {
    			var XMLesterno:XML;
    			var loader:URLLoader = new URLLoader();
    			var request_:URLRequest = new URLRequest("prova_5.xml");
    			loader.load(request_);
    			loader.addEventListener(Event.COMPLETE,onComplete);
    			function onComplete(event_:Event) {
    				XMLesterno = new XML(loader.data);
    			}
    			trace (XMLesterno);
    		}
    	}
    }
    Se metto trace (XMLesterno) all'interno della funzione onComplete il codice legge correttamente l'XML, ma dentro ad una funzione richiamata da un evento diventa quasi inutile leggere l'XML, io vorrei poterlo utilizzare in tutto il codice. Purtroppo fuori da onComplete la variabile XMLesterno è null. Ho provato anche ad assegnare un return XMLesterno ad onComplete, ma non cambia nulla, resta sempre null.

  2. #2
    Ho anche un altro problema, che aggiungo in coda a questo.
    Pochi giorni fa ho appreso come estrarre i dati da mySQL passando attraverso un file php.
    Il difetto di quel metodo - da molte parti riproposto più o meno sempre uguale - è che occorre creare una stringa in php contenente le variabili da passare ad actionscript, così se i dati da estrarre sono molti la stringa diventa lunghissima ed il metodo mi sembra un po' spartano.
    Così pensavo che si potesse creare un xml con un php, e poi leggere l'xml con actionscript.
    Il problema è che l'xml deve essere riscritto ogni volta, per contenere i dati sempre aggiornati; l'xml deve essere scritto dal php prima che venga letto dall'actionscript e quindi mi chiedo come fare ad attivare il codice php attraverso l'actionscript. Ho provato a caricare il php con un URLLoader ma il php non entra in azione, ovvero non scrive il codice xml.
    Il problema è un po' simile a quello proposto in questa discussione
    http://forum.html.it/forum/showthrea...readid=1096173
    dove però non è stato risolto. Ma son convinto che si può fare, solo che non so come, cerco qualche dritta.

  3. #3
    codice:
    package {
    	import flash.display.Sprite;
    	import flash.net.URLLoader;
    	import flash.net.URLRequest;
    	import flash.events.Event;
    	
    
            public var XMLesterno:XML
    
    	public class prova_5 extends Sprite {
    		function prova_5():void {
    			importa();
    		}
    		function importa():void {
    			var loader:URLLoader = new URLLoader();
    			var request_:URLRequest = new URLRequest("prova_5.xml");
    			loader.load(request_);
    			loader.addEventListener(Event.COMPLETE,onComplete);
    			function onComplete(event_:Event) {
    				XMLesterno = new XML(loader.data);
    			}
    			trace (XMLesterno);
    		}
    	}
    }
    in questo modo XMLesterno è visibile come proprietà della classe, ovviamente se lo leggi prima che sia completato il caricamente da undefined, in alternativa puoi creare un metodo. In questo caso istanza.getXML()

    Non li ho provati ma dovrebbero andare.


    codice:
    package {
    	import flash.display.Sprite;
    	import flash.net.URLLoader;
    	import flash.net.URLRequest;
    	import flash.events.Event;
    	
            private var XMLesterno:XML
    
    	public class prova_5 extends Sprite {
    		function prova_5():void {
    			importa();
    		}
    		function importa():void {
    			var loader:URLLoader = new URLLoader();
    			var request_:URLRequest = new URLRequest("prova_5.xml");
    			loader.load(request_);
    			loader.addEventListener(Event.COMPLETE,onComplete);
    			function onComplete(event_:Event) {
    				XMLesterno = new XML(loader.data);
    			}
    			trace (XMLesterno);
    		}
                   public function getXML():XML{
                          return XMLesterno
                   }
    	}
    }

  4. #4
    Grazie per l'aiuto.
    Credo che sia nel primo che nel secondo codice la definizione di variabile vada messa dopo l'apertura della classe, perchè altrimenti da un errore di compilazione:
    5006: Un file di ActionScript non può avere più di una definizione visibile esternamente: XMLesterno, prova_5

    Il primo caso quindi diventa:
    codice:
    package {
    	import flash.display.Sprite;
    	import flash.net.URLLoader;
    	import flash.net.URLRequest;
    	import flash.events.Event;
    	
    
    
    	public class prova_5 extends Sprite {
    
    		public var XMLesterno:XML;
    
    		function prova_5():void {
    			importa();
    		}
    		function importa():void {
    			var loader:URLLoader = new URLLoader();
    			var request_:URLRequest = new URLRequest("prova_5.xml");
    			loader.load(request_);
    			loader.addEventListener(Event.COMPLETE,onComplete);
    			function onComplete(event_:Event) {
    				XMLesterno = new XML(loader.data);
    			}
    			trace (XMLesterno);
    		}
    	}
    }
    Tuttavia restitiusce sempre null.
    Il secondo caso non l'ho provato ma è uguale, c'è solo in più la funzione get per l'accesso alla variabile privata.

    Riguardo invece al secondo problema, ovvero l'uso di php da actionscript, non ho pensato che il codice php posso farlo eseguire dalla pagina che incorpora l'swf prima dell'incorporamento, quindi il problema non si pone nemmeno.

  5. #5
    Così funziona:
    codice:
    package {
    	import flash.display.Sprite;
    	import flash.net.URLLoader;
    	import flash.net.URLRequest;
    	import flash.events.Event;
    	
    
    
    	public class prova_6 extends Sprite {
    
    		public var XMLesterno:XML;
    
    		function prova_6():void {
    			importa();
    		}
    		function importa():void {
    			var loader:URLLoader = new URLLoader();
    			var request_:URLRequest = new URLRequest("prova_6.xml");
    			loader.load(request_);
    			loader.addEventListener(Event.COMPLETE,onComplete);
    			function onComplete(event_:Event) {
    				XMLesterno = new XML(loader.data);
    				ritornaXML(XMLesterno);
    			}
    		}
    		function ritornaXML(myXML:XML) {
    			trace (myXML);
    		}
    	}
    }
    In fondo non cambia molto, è solo una questione di forma, separare la funzione che richiama l'XML da quella che lo utilizza.

  6. #6
    Sì vero, hai ragione.

  7. #7
    Però l'ultima soluzione anche se funziona non è che soddisfa pienamente.
    Non sono un grande esperto, mi sono avvicinato ad AS3 da circa un mese, però a vederla così si capisce che qualcosa non quadra. Il fatto è che chiamando la funzione che carica l'XML viene automaticamente eseguita la funzione che lavora sull'XML. Questo comporta che se avessi più cose da fare con lo stesso XML, in momenti diversi, dovrei ricaricare l'XML ogni volta che lo uso.
    In sostanza se volessi creare una classe che, passandogli come parametro l'URL, carica l'XML, ed un'altra classe che, passandogli come parametro un XML, ha dei metodi che lavorano sull'XML, non saprei come fare proprio perchè il caricamento è separato dalla lettura.

  8. #8
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    Ciao Giancarlo75

    Scusa se mi intrometto anche se forse non ho capito bene il problema e non sono un esperto di ActionScript ma vedo che crei e istanzi la variabile loader:URLLoader all'interno della funzione e quindi al di fuori della funzione stessa non è visibile.

    Se invece la istanzi a livello globale, sarà visibile e utilizzabile in tutte le funzioni in cui ti serve:

    Codice PHP:
    package 
    {
        
    import flash.display.Sprite;
        
    import flash.net.URLLoader;
        
    import flash.net.URLRequest;
        
    import flash.events.Event;

        public class 
    prova_5 extends Sprite
        
    {
            public var 
    XMLesterno:XML;
            private var 
    loader:URLLoader;

            public function 
    prova_5():void
            
    {
                
    importa();
            }
            private function 
    importa():void
            
    {
                
    loader = new URLLoader();
                var 
    request_:URLRequest = new URLRequest("prova_5.xml");
                
    loader.load(request_);
                
    loader.addEventListener(Event.COMPLETE,onComplete);
            }
            private function 
    onComplete(event_:Event)
            {
                
    XMLesterno = new XML(loader.data);
                
    trace(XMLesterno);
                
    pippo();
            }
            private function 
    pippo():void
            
    {
                
    trace(XMLesterno);
            }
        }

    Ho fatto una prova e funziona tutto correttamente:
    I trace visualizzano i dati contenuti nell' .xml in entrambe le funzioni dove richiesto.

    ciao

  9. #9
    Ciao, hai fatto benissimo ad intrometterti anche perchè sei riuscito a risolvere il problema. Non l'ho ancora provato, ora lo provo ma se dici che funziona ci credo. Il motivo per cui inserivo onComplete dentro importa è semplice: non ci avevo pensato. Grazie per l'aiuto.

  10. #10
    Ritorno sull'argomento perchè purtroppo non è per niente risolto come mi sembrava.
    L'ultima soluzione funziona perchè la funzione pippo() viene chiamata all'interno della funzione onComplete. In pratica anche in questo esempio vengono svolte operazioni sull'XML subito dopo il suo caricamento, senza la possibilità di rimandare ad altri eventi tali operazioni.

    Per esempio se volessi costruirmi una galleria di immagini prese da un XML, dovrei avere due pulsanti, avanti e indietro, per cambiare le miniature. Questi due pulsanti se cliccati dovrebbero attivare una funzione che legge solo un certo numero di item sull'XML e questa lettura non può essere fatta finche l'XML non diventa disponibile in tutto il codice.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.