Comunidad de diseño web y desarrollo en internet online

¿Existe en AS3 algo similar a los .properties de Java?

Citar            
MensajeEscrito el 16 Feb 2012 11:47 am
Buenos días,

Estoy un poco pez en esto de AS3 y Flash, yo de siempre he programado en Java y estoy echando alguna cosilla en falta al ponerme con AS3.

Siempre he utilizado los ficheros .properties de Java que consisten en pares nombre - valor para evitar por ejemplo... escribir a piñón el nombre o la ruta de un archivo y así también poder cambiarlo sin necesidad de volver a compilar todo el proyecto.

¿Sabeis si existe algo parecido a esto para AS3?

He estado buscando y la única alternativa que he visto de momento y que parece "fácil" de tratar sería un fichero XML pero me parece más intuitiva la otra opción.

Muchas gracias por la ayuda

Por lore711

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Feb 2012 11:58 am
Efectivamente, se suele usar ficheros XML dado que no hay properties, pero puedes escribir ficheros de texto con pares de nombre/valor y utilizarlos, solo que debes parsearlos tu, no hay algo estandard implementado. Si usas Flex, hay varios frameworks que vienen con archivos de configuración, eso dependerá de cual uses

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 16 Feb 2012 12:10 pm
Muchas gracias por la rapidez de tu respuesta Jorge

Trabajo en Flash, así que de momento me voy a inclinar por utilizar un XML y cuando tenga un poco más de tiempo libre intentaré hacer un parseador propio.

Ya os contaré cómo va

Muchas gracias nuevamente

Por lore711

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Feb 2012 09:00 pm
Hola otra vez,

Me he puesto a hacer un fichero de propiedades con un archivo xml.

El archivo del que cargo los datos se llama propiedades.xml y su contenido es el siguiente:

Código XML :

<propiedades>
   <propiedad nombre = "nivelLog" valor = "DEBUG"></propiedad>
   <propiedad nombre = "nombre" valor = "fichero.log"></propiedad>
   <propiedad nombre = "entorno" valor = "local"></propiedad>   
</propiedades>


En primer lugar, para acceder a cada uno de los atributos, lo he hecho con el siguiente código:

Código ActionScript :

var xmlExterno : XML;
var loader : URLLoader = new URLLoader();
var request : URLRequest = new URLRequest("propiedades.xml");
loader.load(request);
loader.addEventListener(Event.COMPLETE, onComplete);


y la función onComplete:

Código ActionScript :

function onComplete(event : Event) : void {
   var loader : URLLoader = event.target as URLLoader;
   if (loader != null) {
      xmlExterno = new XML(loader.data);
      trace(xmlExterno.toXMLString());
      trace("obtengo la propiedad nivelLog " + xmlExterno.propiedad.(@nombre == "nivelLog").@valor);
   }else {
      trace("loader is not a URLLoader!!");
   }
}


Esto funciona correctamente, en la salida me vuelca primero el contenido del xml y luego el valor de nivelLog

Para intentar mejorar este código he pensado en hacer una función llamada getPropiedad a la que le pasara en este caso el String "nivelLog" con el nombre de la propiedad que quiero obtener según corresponda y es aquí donde me he encontrado con el problema, mi esbozo de función es el siguiente:

Código ActionScript :

 function getPropiedad (prop : String) : String {
   var xmlExterno : XML;
   var loader : URLLoader = new URLLoader();
   var request : URLRequest = new URLRequest("propiedades.xml");
   loader.load(request);
   loader.addEventListener(Event.COMPLETE, onComplete);
   trace("intento " + xmlExterno.propiedad.(@nombre == prop).@valor);
   return xmlExterno.propiedad.(@nombre == "nivelLog").@valor;
}


El problema que tengo es que no sé cómo hacer para componer la línea:

Código :

 xmlExterno.propiedad.(@nombre == prop).@valor

y que donde pone prop sustituya por el valor de la variable

¿Sabéis si se puede hacer esto así? ¿o tengo que hacer una función para cada una de las propiedades que quiera obtener?

Muchas gracias

Lore

Por lore711

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 Feb 2012 10:05 pm
No lo recuerdo bien, pero lo puedes encontrar en las referencias de EX4, que es un standard para el parseo de XML. Creo que se usaba {prop} para meter una variable, pero no estoy seguro

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 20 Feb 2012 12:31 pm
Hola Jorge,

Probé con esto que me comentaste de las {} para pasar el valor de una variable, pero según he visto, esto únicamente puede ser utilizado en un objeto XML. Cito textualmente el ejemplo mostrado en la guía de Adobe "Programación con Actionscript 3.0"

Guía de Adobe "Programación con Actionscript 3.0" escribió:


También se puede pasar datos por referencia (desde otras variables) a un objeto XML, como se indica en el siguiente ejemplo:

Código ActionScript :

var tagname : String = "item";
var attributename : String = "id";
var attributevalue : String = "5";
var content : String = "Chicken";
var x : XML = < {tagname} {attributename}={attributevalue}>{content}</{tagname}>;
trace(x.toXMLString());

//Salida : <item id="5">Chicken</item>




Yo probé a utilizarlo así:

Código :

trace("intento " + xmlExterno.propiedad.(@nombre == {prop}).@valor);


Y me daba error

Espero que al menos sirva de ayuda para alguien en algún momento

En un momento comentaré cómo estoy intentando de dar solución a esto de tener un fichero de propiedades

Saludos

Lore

Por lore711

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 20 Feb 2012 05:30 pm
Hola otra vez, para dar solución a este tema que planteaba hace unos días, me he decidido a crear una clase llamada Propiedades siguiendo el patrón de diseño Singleton (para que no se puedan crear instancias de la clase, sino que haya sólo una).

En el código que pegaré a continuación, puede verse que una vez esté creada la instancia, se procede a cargar las propiedades del fichero propiedades.xml.
Además tengo otro método llamado getPropiedad(String) cuya misión es obtener el valor de la propiedad pasada como parámetro.

pongo el código de la clase y a continuación comento mi problema

Código ActionScript :

package 
{
   import flash.events.Event;
   import flash.net.URLLoader;
   import flash.net.URLRequest;
   
   /**
    * ...
    * @author Lorena
    */
   public class Propiedades {
      private static var instancia : Propiedades;
      private static var v_propiedades : Array = null;
      private static var permitidaInstancia : Boolean;
      
      public function Propiedades() {
         if (!permitidaInstancia) {
            throw new Error("Debes usar getPropiedades()");
         }else {
            trace("Se inicializó una instancia de Propiedades");
            if (v_propiedades == null) {
               trace("El array de propiedades es null");
               var loader : URLLoader = new URLLoader();
               var request : URLRequest = new URLRequest("propiedades.xml");
               loader.load(request);
               loader.addEventListener(Event.COMPLETE, cargarPropiedades);
            }else {
               trace("Ya están todas las propiedades cargadas en el Array");
               for (var s : String in v_propiedades) {
                  trace("propiedad " + s + "= " + v_propiedades[s]); 
               }
            }
         }
      }
      
      public static function getPropiedades() : Propiedades {
         trace("Entro en getPropiedades()");
         if (instancia == null) {
            permitidaInstancia = true;
            instancia = new Propiedades();
            permitidaInstancia = false;
         }else {
            trace("se devuelve la instancia existente");
         }
         return instancia;
      }
      
      static private function cargarPropiedades(e:Event):void {
         trace("Estoy en cargarPropiedades");
         var loader : URLLoader = e.target as URLLoader;
         var xmlExterno : XML = new XML(loader.data);
         v_propiedades = new Array();

         if (loader != null) {
            for each(var nodo : XML in xmlExterno.elements()) {
               v_propiedades[nodo.@nombre] = nodo.@valor;
               trace("nombre: " + nodo.@nombre + ". valor: " + nodo.@valor);
               trace("accedo a array " + nodo.@nombre + " su valor " + v_propiedades[nodo.@nombre]);
            }
            for (var s : String in v_propiedades) {
               trace("propiedad " + s + " = " + v_propiedades[s]); 
            }
         }else {
            trace("loader is not a URLLoader!!!");
         }
         getPropiedad("nivelLog");
      }
      
      public static function getPropiedad(prop : String) : String {
         // cuando llego a este método mi array de propiedades parece ser que está vacío
         trace("Quieres el valor de la propiedad: " + prop);
         trace("Este es su valor " + v_propiedades[prop]);
         trace(" ");
         trace("Recorro el array en getPropiedad()");
         if (v_propiedades == null) {
            trace("el array de propiedades es null");
         }
         for (var s : String in v_propiedades) {
            trace("propiedad " + s + " = " + v_propiedades[s]); 
         }
         trace("probando " + v_propiedades["nivelLog"]);
         return v_propiedades[prop]
      }
   }
}



El problema es que en mi main, que es el siguiente

Código ActionScript :

package 
{
   import flash.display.MovieClip;
   
   /**
    * ...
    * @author Lorena
    */
   public class Main extends MovieClip {
      
      private static var pro : Propiedades = Propiedades.getPropiedades();
      
      public function Main() : void {
         
         var nivelLog : String = Propiedades.getPropiedad("nivelLog");
         trace("El valor tomado del fichero en nivelLog es: " + nivelLog);
      }
      
   }
   
}

Comienza a cargar el xml, pero se produce la llamada a la función getPropiedad antes de que el xml haya terminado de cargarse

Pongo a continuación la salida obtenida para que podais seguir por donde pasa:

Código :

[SWF] propiedades.swf - 3820 bytes tras la descompresión
Entro en getPropiedades()
Se inicializó una instancia de Propiedades
El array de propiedades es null
Quieres el valor de la propiedad: nivelLog
TypeError: Error #1009: Cannot access a property or method of a null object reference.
   at Propiedades$/getPropiedad()[C:\Users\Lore\Desktop\pruebas propiedades\Propiedades.as:72]
   at Main()[C:\Users\Lore\Desktop\pruebas propiedades\Main.as:15]
   at runtime::ContentPlayer/loadInitialContent()
   at runtime::ContentPlayer/playRawContent()
   at runtime::ContentPlayer/playContent()
   at runtime::AppRunner/run()
   at global/runtime::ADLEntry()
Estoy en cargarPropiedades
nombre: nivelLog. valor: DEBUG
accedo a array nivelLog su valor DEBUG
nombre: nombre. valor: fichero.log
accedo a array nombre su valor fichero.log
nombre: entorno. valor: local
accedo a array entorno su valor local
propiedad nivelLog = DEBUG
propiedad nombre = fichero.log
propiedad entorno = local
Quieres el valor de la propiedad: nivelLog
Este es su valor DEBUG
 
Recorro el array en getPropiedad()
propiedad nivelLog = DEBUG
propiedad nombre = fichero.log
propiedad entorno = local
probando DEBUG



¿De qué manera puedo solucionar este problema sin poner la función getPropiedad dentro del método cargarPropiedades?

Gracias, es que ando un poco pez con esto de la gestión de eventos

Un saludo

Lore

Por lore711

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 Feb 2012 12:35 pm
Tip: si estás aprendiendo dedícale el tiempo que quieras, todo aporta. Si es un trabajo real, hay una decena de frameworks que tienen esto resuelto (tomándolo incluso de Java) y no tiene mucho sentido reinventar la rueda.
Aquí puedes ver ejemplos de frameworks en Flex: http://flash-db.com/Main/2011/05/15/flex-frameworks/ Swiz y Parsley son dos que usan archivos de configuración en una forma muy parecida a Java.
En cuando a acceder a datos que aún no han sido cargados, espera el callback, si usas un loader, oues el evento complete

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 22 Feb 2012 02:48 pm
Hola,

Ya he conseguido ver el problema que tenía. Resulta que cargaba el archivo xml con eventos y por tanto de manera asíncrona, se cargaba el xml en segundo plano. Lo que necesitaba era cargarlo de manera síncrona.

He sustituido el código:

Código :

               var loader : URLLoader = new URLLoader();
               var request : URLRequest = new URLRequest("propiedades.xml");
               loader.load(request);
               loader.addEventListener(Event.COMPLETE, cargarPropiedades);


y la correspondiente función cargarPropiedades por:

Código ActionScript :

        var file : File = File.applicationDirectory.resolvePath("propiedades.xml");
   var fileStream : FileStream = new FileStream();
   fileStream.open(file, FileMode.READ);
   var propsXML : XML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable))


y de esta forma, hasta que no cargo el xml no se ejecuta la linea del main

Código :

var nivelLog : String = Propiedades.getPropiedad("nivelLog");


Espero le sirva a alguien que tenga una duda similar en algún momento

Un saludo

Lore

Por lore711

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 Feb 2012 02:52 pm
Eso es lo que quería decir con esto:

En cuando a acceder a datos que aún no han sido cargados, espera el callback, si usas un loader, pues el evento complete


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.