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

    Leggere dei dati da una Classe Singleton

    Ciao a tutti

    Sto scrivendo una classe Singleton in actionscript 3.0 da utilizzare poi in Flex 3 per recuperare dei valori di variabili memorizzate in un Object.


    La classe in questione è così scritta

    codice:
    package 
    {
    	//Classe Singleton per caricare il file di configurazione config.txt
    	import mx.controls.Alert;
    	import mx.rpc.events.FaultEvent;
    	import mx.rpc.events.ResultEvent;
    	import mx.rpc.http.HTTPService;
    	
    	public class ConfigUrl
    	{
    		[Bindable]
    		public var dataList:Object = new Object();
    		
    		
    		private var variableTXT:HTTPService = new HTTPService();
    		
    		
    		private static var _instance:ConfigUrl;
    		private static var _allowInstantiation:Boolean;
    		
    		public function ConfigUrl(){
    			if (!_allowInstantiation) {
            	    		throw new Error("Error: Instantiation failed: Use ConfigUrl.getInstance() instead of new.");
    			}
    		}
    		
    		public static function getInstance():ConfigUrl{
    			if (_instance == null) {
    				_allowInstantiation = true;
    				_instance = new ConfigUrl();
    				_allowInstantiation = false;
    			}
    			return _instance;
    		}
    		
    		public function load():void{
    			variableTXT.url = "assets/config.txt";
    			variableTXT.resultFormat = "text";
    			variableTXT.addEventListener(ResultEvent.RESULT, handleLoad);
    			variableTXT.addEventListener(FaultEvent.FAULT, handleFault);
    			variableTXT.send();
    		}
    		
    		private function handleFault(e:FaultEvent):void{
    					
    			Alert.show('An error occured while trying to load','ERROR MESSAGE');
    		
    		}
    		
    		private function handleLoad(e:ResultEvent):void
    		{
    			
    				var variableData:String = e.target.lastResult;
    				var bookDataArray:Array = variableData.split("\n");
    				
    				var dataList:Object = {};
    				// cariabile che conta le righe dal file config.txt
    				var dataA:Array;
    				// per ogni riga viene fatto uno split 
    				for (var i:int = 0; i < bookDataArray.length; i++)
    				{
    					dataA = bookDataArray[i].split("=");
    					//var stringID:String = dataA[0];
    					dataList[dataA[0]] = dataA[1];
    					trace("dataList."+[dataA[0]]+" = ", dataList[dataA[0]]);
    					trace(dataList[dataA[0]);
    		        }
    		}
    	}
    }
    Ora vorrei da un applicazione in Flex (mxml) richiamare dei valori di alcune variabili memorizzate nel dataList.

    La sintassi che uso in flex è:



    codice:
    	<mx:Script>
    		<![CDATA[
    			import mx.events.FlexEvent;
    			
    			public function init(e:FlexEvent):void{
    				labelID1.text = "Il valore è: " + ConfigUrl.getInstance().dataList.VARIABILE1;
    			}
    			
    		]]>
    	</mx:Script>
    dove labelID1 è l'id di un componente label sul mio stage.

    VARIABILE1 è una variabile memorizzata nel mio object dataList ma aimè mi restituisce un valore undefined.

    Sto creando questa classe per leggere delle variabili da un file di testo config.txt fatto così:


    codice:
    VARIABILE1 = valore1
    VARIABILE2 = valore2
    VARIABILE3 = valore3

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Non lo puoi fare in quel modo, devi attendere il caricamento dei dati nella classe e se nel mxml li richiami subito, non lo stai facendo, per questo ottieni undefined.

  3. #3
    Ma se temporizzo?
    CIoè se metto un timer?

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Originariamente inviato da ryosaeb4
    Ma se temporizzo?
    CIoè se metto un timer?
    Sarebbe meglio sfruttare direttamente un listener, già che intendi usare un timer di controllo.
    Non è complicato, basta scrivere la classe come estensione della classe EventDispatcher e automaticamente avresti a disposizione il metodo "dispatchEvent" che poi sfrutterai dentro alla funzione handleLoad per passare lo stesso evento alla classe (all'istanza ottenuta con il getInstance()).
    Ora non riesco a inserirti le modifiche da effettuare, vedi se riesci da solo, sennò fai un fischio qui che le inserisco (stasera).

  5. #5
    Ci sto provando ma non va...

    ti posto il codice della mia classe Singleton

    codice:
    package 
    {
    	//Classe Singleton per caricare il file config.txt
    	
    	import mx.controls.Alert;
    	import mx.rpc.events.FaultEvent;
    	import mx.rpc.events.ResultEvent;
    	import mx.rpc.http.HTTPService;
    	import mx.utils.StringUtil;
    	import flash.events.EventDispatcher;
    	
    	public class ConfigUrl
    	
    	{
    		[Bindable]
    		public var dataList:Object = new Object();
    		
    		
    		private var variableTXT:HTTPService = new HTTPService();
    		
    		
    		private static var _instance:ConfigUrl;
    		private static var _allowInstantiation:Boolean;
    		
    		public function ConfigUrl(){
    			if (!_allowInstantiation) {
            	    		throw new Error("Error: Instantiation failed: Use ConfigUrl.getInstance() instead of new.");
    			}
    		}
    		
    		public static function getInstance():ConfigUrl{
    			if (_instance == null) {
    				_allowInstantiation = true;
    				_instance = new ConfigUrl();
    				_allowInstantiation = false;
    			}
    			return _instance;
    		}
    		
    		public function load():void{
    			variableTXT.url = "assets/config.txt";
    			variableTXT.resultFormat = "text";
    			variableTXT.addEventListener(ResultEvent.RESULT, handleLoad);
    			variableTXT.addEventListener(FaultEvent.FAULT, handleFault);
    			variableTXT.send();
    		}
    		
    		private function handleFault(e:FaultEvent):void{
    					
    			Alert.show('An error occured while trying to load','ERROR MESSAGE');
    		
    		}
    		
    		private function handleLoad(e:ResultEvent):void
    		{
    				
    				var variableData:String = e.target.lastResult;
    				var bookDataArray:Array = variableData.split("\n");
    				
    				dataList = new Object();
    				var dataA:Array;
    				for (var i:int = 0; i < bookDataArray.length; i++)
    				{
    					dataA = bookDataArray[i].split("=");
    					dataList[dataA[0]] = dataA[1];
    					trace("dataList."+[dataA[0]]+" = ", dataList[dataA[0]]);
    		        }
    		}
    	}
    }

    Invece il file mxml di test è:

    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="ConfigUrl.getInstance().load()" creationComplete="init(event)">
    	<mx:Script>
    		<![CDATA[
    			import mx.events.FlexEvent;
    
    			
    			public function init(e:FlexEvent):void{
    				labelID1.text = "Il valore è: " + ConfigUrl.getInstance().dataList.BASE_URL;
    				labelID2.text = "Il valore è: " + ConfigUrl.getInstance().dataList.SERVICE_NAME;
    				labelID3.text = "Il valore è: " + ConfigUrl.getInstance().dataList.IMAGE_PATH;
    			}
    			
    		]]>
    	</mx:Script>
    	<mx:VBox x="10" y="10" height="452" width="332">
    		<mx:Label id="labelID1" width="323"/>
    		<mx:Label id="labelID2" width="323"/>
    		<mx:Label id="labelID3" width="323"/>
    
    	</mx:VBox>
    	
    	
    	
    </mx:Application>

    Grazias, cmq continuo a provare...

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Nella dichiarazione della classe devi inserire l'estensione alla EventDispatcher

    public class ConfigUrl extends EventDispatcher

    poi nella funzione handleLoad devi aggiungere il dispatchEvent

    Codice PHP:
    private function handleLoad(e:ResultEvent):void {
        var 
    variableData:String e.target.lastResult;
        var 
    bookDataArray:Array = variableData.split("\n");
        
    dataList = new Object();
        var 
    dataA:Array;
        for (var 
    i:int 0bookDataArray.lengthi++) {
            
    dataA bookDataArray[i].split("=");
            
    dataList[dataA[0]] = dataA[1];
            
    trace("dataList."+[dataA[0]]+" = "dataList[dataA[0]]);
        }
        
    getInstance().dispatchEvent(e);

    Lo mettiamo alla fine così dovremo essere certi che le altre operazioni al load siano compiute.
    Poi nel file mxml dovremo avere una roba del genere:
    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="ConfigUrl.getInstance().load()" creationComplete="init(event)">
    
    	<mx:Script>
    		<![CDATA[
    		import mx.events.FlexEvent;
    		import mx.rpc.events.ResultEvent;
    
    		public function init(e:FlexEvent):void{
    			ConfigUrl.getInstance().addEventListener(ResultEvent.RESULT, resultHandle);
    		}
    		
    		private function resultHandle (e:ResultEvent) {
    			labelID1.text = "Il valore è: " + e.target.dataList.BASE_URL;
    			labelID2.text = "Il valore è: " + e.target.dataList.SERVICE_NAME;
    			labelID3.text = "Il valore è: " + e.target.dataList.IMAGE_PATH;
    		}
    
    		]]>
    	</mx:Script>
    	<mx:VBox x="10" y="10" height="452" width="332">
    		<mx:Label id="labelID1" width="323"/>
    		<mx:Label id="labelID2" width="323"/>
    		<mx:Label id="labelID3" width="323"/>
    	</mx:VBox>
    
    </mx:Application>
    Il ragionamento pressappoco è questo, vediamo se funziona.

  7. #7
    Sulla funzione resultHandle ho questo errore:


    Codice PHP:
    Severity and Description    Path    Resource    Location    Creation Time    Id
    1008
    : return value for function 'resultHandle' non contiene una dichiarazione di tipo.    ReadVariable2/src    ReadVariableClass.mxml    line 12    1235483584021    2885 

  8. #8
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Bisognerebbe fare un po' di debug a partire da quella funzione. L'errore non lo conosco e per questo non ti so dire esattamente perchè succeda.
    Ho fatto qualche test per verificare l'idea di base e ottengo il risultato sperato (con flash però).

  9. #9
    codice:
    private function resultHandle(e:ResultEvent):void {....

    Così non mi da più l'errore ma aimè non vedo nulla in fase di esecuzione.

    provo in debug

  10. #10
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Non ho idea di come funzionano esattamente gli oggetti in flex, ma non sarà necessario risalire al Label passando per il box?

    Intanto prova a tracciare il valore di e.target.dataList nella funzione per vedere cosa restituisce (si può usare il trace in flex?).

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.