SlideBar Class

Marzo 30th, 2009

Hace tiempo que estoy haciendo pruebas y siempre echaba en falta una librería para poder crear un SlideBar y poder cambiar valores sobre la marcha. Así que aquí va la librería que uso para crear las SlideBars.

Extiende la clase Sprite así que se añade como un elemento más y se le dan valores mediante la propiedad value. Si cambia el valor lanza un evento con el cambio.

CODE:
  1. //Ejemplo de uso de SlideBar Class
  2. var slide1:SlideBar= new SlideBar(0,100,-10,10);
  3. // valor inicial: 0
  4. // longitud px: 100
  5. // valor mínimo: -10
  6. // valor Máximo: 10
  7. slide1.addEventListener(SlideBarEvent.CHANGE_VALUE,change1);
  8. addChild (slide1);
  9.  
  10. function change1(evt:SlideBarEvent):void
  11. {
  12.     trace(evt.value);
  13. }

Descargate la clase aquí

Quitar mx_internal_uid de un ArrayCollection

Marzo 22nd, 2009

Otra función que me hacía falta. Siempre que envío datos por PHP e incluyo algún ArrayCollection guardaba el identificador único que generar Flex cada vez que crea un elemento. Así que hice esta función para quitar esa propiedad de cada elemento antes de enviarlo. Así solo se almacena la información que es necesaria.

CODE:
  1. /**
  2. *       Quita la propiedad mx_internal_uid de un ArrayCollection.
  3. *
  4. *       @param ac ArrayCollection.
  5. *
  6. *       @returns ArrayCollection
  7. *
  8. *       @langversion ActionScript 3.0
  9. *       @playerversion Flash 9.0
  10. *       @tiptext
  11. */
  12. public static function removeMx_internal_uid(ac:ArrayCollection):ArrayCollection
  13. {
  14.     for each(var item:Object in ac)
  15.     {
  16.         delete item.mx_internal_uid;
  17.     }
  18.     return ac;
  19.                 }

removeMarks. Quitar acentos en un string

Marzo 19th, 2009

Esta funcion la sirve para quitar los acentos en una cadena para poder usarlo en busquedas de textos. No he encontrado nada mas, así que creo que puede ser una buena solución.

CODE:
  1. /**
  2. *       Cambia los caracteres con acentos por sus letras sin acento.
  3. *
  4. *       @param str Cadena en la que quitar los acentos.
  5. *
  6. *       @returns String
  7. *
  8. *       @langversion ActionScript 3.0
  9. *       @playerversion Flash 9.0
  10. *       @tiptext
  11. */
  12. public static function removeMarks(str:String):String
  13. {
  14.     str=str.replace(new RegExp('á|à|â|ä','g'),'a');
  15.     str=str.replace(new RegExp('é|è|ê|ë','g'),'e');
  16.     str=str.replace(new RegExp('í|ì|î|ï','g'),'i');
  17.     str=str.replace(new RegExp('ó|ò|ô|ö','g'),'o');
  18.     str=str.replace(new RegExp('ú|ù|û|ü','g'),'u');
  19.     str=str.replace(new RegExp('Á|À|Â|Ä','g'),'A');
  20.     str=str.replace(new RegExp('É|È|Ê|Ë','g'),'E');
  21.     str=str.replace(new RegExp('Í|Ì|Î|Ï','g'),'I');
  22.     str=str.replace(new RegExp('Ó|Ò|Ô|Ö','g'),'O');
  23.     str=str.replace(new RegExp('Ú|Ù|Û|Ü','g'),'U');
  24.     return str;
  25. }

Yo lo tengo incluída en una clase que se llama StringUtil así que para usarlo pongo:

CODE:
  1. var sinAcentos:String=StringUtil.removeMarks('búsqueda');
  2. // devuelve 'busqueda'
  3.  

Papervision3D: primera prueba

Febrero 6th, 2009

Ya tenía ganas de tener algo de tiempo para meterme con Papervision3D y voy a ver si aprendo un poco como funciona y hasta donde puede llegar para utilizarlo en futuros trabajos.

Por ahora he hecho este ejemplo para ver como va en distintos ordenadores.


getIndexByProperty (en un ArrayCollection)

Enero 29th, 2009

A la hora de ajustar comboboxes o de encontrar un elemento en un ArrayCollection he creado una pequeña función estática a la que se le pasa el ArrayCollection en el que queremos hacer la búsqueda, la propiedad en la que queremos buscar el valor y el objeto que queremos encontrar y me devuelve el index de ese item dentro del ArrayCollection.

Lo he incluído dentro una librería de utilidades:

CODE:
  1. package com.esneo.utils
  2. {
  3.     import mx.collections.ArrayCollection;
  4.        
  5.     public class ArrayCollectionUtil
  6.     {
  7.         public static function getIndexByProperty(ac:ArrayCollection,propertyName:String,searchValue:Object):int
  8.         {
  9.             var index:int=-1;
  10.             for (var con:Number=0; con<ac.length; con++)
  11.             {
  12.                 if (ac[con][propertyName]==searchValue)
  13.                 {
  14.                     index=con;
  15.                     break;
  16.                 }
  17.             }
  18.             return index;
  19.         }
  20.     }
  21. }

Así no tendremos que buscar un item completo sino que podremos buscar el index de un item con un valor determinado en una de sus propiedades.

Ajustar Value Objects

Enero 28th, 2009

A la hora de crear apliaciones en Cairngorm suelo utilizar Value Objects (VO) distintos para los listados que para la edición. De esta forma puedo tener un listado de objetos que no tarde mucho al cargar y a la hora de editar cargar toda la información del elemento que quiero editar. Hasta aquí sin problema, pero los problemas empiezan cuando quieres guardar la información. Por un lado tu envias al servidor un objeto con toda la información que has editado, pero por otro lado necesitas actualizar los datos del modelo solo con las propiedades del VO que necesitas para el listado.

Hasta ahora creaba objetos nuevos del tipo de listado y pasaba las propiedades una a una, pero ahora he añadido una función estática a mis VOs de forma que puedo pasar cualquier VO a otro solo utilizando las propiedades que tenga el primero.

La función sería algo así:

CODE:
  1. public static function fit(obj:Object):tipoVO
  2. {
  3.     var fitItem:tipoVO=new tipoVO();
  4.     var fitItemInfo:Object=ObjectUtil.getClassInfo(fitItem);
  5.     var props:Array=fitItemInfo.properties;
  6.     for each (var prop:Object in props)
  7.     {
  8.         if (obj.hasOwnProperty(prop.localName))
  9.         {
  10.             fitItem[prop.localName]=obj[prop.localName];
  11.         }
  12.     }
  13.     return fitItem;
  14. }

En esta función se sustituiría el tipoVO por el tipo de la clase del VO en la que se defina la función.

Básicamente cogemos la información del objeto que vamos a devolver utilizando la función getClassinfo de la clase mx.utils.ObjectUtil. Esta función devuelve un objeto en el que se almacenan el nombre de la clase y las propiedades de la misma.

Con esta información recorremos las propiedades y si existen en el objeto que sirve origen le pasamos los valores en al objeto de destino.

Fechas entre MySQL y PHP

Enero 27th, 2009

Siempre es un lío y ya si al final lo tienes que llevar a Flex mas todavía. Pero esta parece una forma muy buena de pasar fechas de MySQL a PHP

De MySQL a PHP:

$fechaPHP=strtotime($fechaMySQL);

Esto nos guarda la fecha para que ya la podamos usar de forma natural en PHP en formato Date;

De PHP a MySQL:

$fechaMySQL=date( ‘Y-m-d H:i:s’, $fechaPHP);

Así formatea la fecha y la pasa como cadena en el formato que guarda MySQL en el DATETIME.

getDefinitionByName

Septiembre 23rd, 2008

Cuando en flash se crean una serie de objetos en la librería que luego serán usados indistintamente me encontré con el problema de que tenía dificultades para crearlos dinamicamente de una forma sencilla.

Imaginemos que tenemos unos botones y que necesitamos crear un menú dependiendo de una serie de datos. Los botones en la librería serían iguales, cada uno con su icono y los llamamos con distintos nombres ('Bot1', 'Bot2', etc) a la hora de crear el objeto sería largo de programar el hacer la creación de ese nuevo objeto del tipo Bot1 o Bot2 dependiendo de lo que nos haga falta, habría que hacer un switch para saber que boton necesitamos y crearlo.

Con el uso de getDefinitionByName podemos coger el nombre del botón que pasariamos en una variable y crearlo y pasarlo como MovieClip.

CODE:
  1. var nomber:String="Bot1";
  2. // obtengo el tipo de objeto para crearlo
  3. // así el tipo de objetos es dinamico <-- ej: Bot1
  4. var classDef:Object = getDefinitionByName(nombre);
  5. var boton:MovieClip=new classDef();

imageExtended

Septiembre 10th, 2008

Aquí voy a poner una clase que me ha hecho falta. Se trata de una clase que extiende la clase Image añade un evento cuando se ha cargado que espera un frame. Si no se espera este frame no coloca la imagen y no se sabe cual es el alto y el ancho entre otras cosas.

No se si habrá otra forma de hacerlo.

CODE:
  1.  
  2. package com.esneo.imageExtended
  3. {
  4.     import flash.events.Event;
  5.        
  6.     import mx.controls.Image;
  7.  
  8.         public class ImageExtended extends Image
  9.         {
  10.             public static const COMPLETE_AND_READY:String="completeAndReady";
  11.                
  12.             public function ImageExtended()
  13.             {
  14.                 super();
  15.                 this.addEventListener(Event.COMPLETE,doComplete);
  16.             }
  17.                
  18.             private function doComplete(e:Event):void
  19.             {
  20.                 this.removeEventListener(Event.COMPLETE,doComplete);
  21.                 this.addEventListener(Event.ENTER_FRAME,doEnterFrame);
  22.             }
  23.                
  24.             private function doEnterFrame(e:Event):void
  25.             {
  26.                 trace(e.target.width+':'+e.target.height);
  27.                 // cuando pasa un frame ya está listo para usarse
  28.                 // ya tiene height y width
  29.                 if (width!=0 || height!=0)
  30.                 {
  31.                     this.removeEventListener(Event.ENTER_FRAME,doEnterFrame);
  32.                     this.dispatchEvent(new Event(COMPLETE_AND_READY));
  33.                 }
  34.         }
  35.     }
  36. }
  37.  

Accediendo al Stage desde una clase

Noviembre 26th, 2007

El Stage es único para todas las clases de Actionscript que desarrollemos en una aplicación pero no siempre es accesible a nivel de clase.

Para una clase que no sea gráfica, que no extienda ni Sprite, ni MovieClip, etc. solo será accesible si se lo pasamos referenciada, en el constructor de la clase por ejemplo:

CODE:
  1. public function MiClase(stageRef:Stage) 

Pero para una clase que instancie Sprite por ejemplo si es accesible pero solo después de que la clase se haya añadido al propio stage o a algún elemento unido a este. Así para evitar que sea null hay que esperar a este evento y a partir de la versión 9.0.28.0 de Flash Player hay dos nuevos eventos que son ADDED_TO_STAGE y REMOVED_FROM_STAGE. Así podemos definir que el acceso al stage una vez el evento se haya alcanzado. Por ejemplo:

CODE:
  1. package
  2. {
  3.   import flash.display.Sprite;
  4.  
  5.   public class MiClaseSprite extend Sprite
  6.   {
  7.       super();
  8.       this.addEventListener(Event.ADDED_TO_STAGE,init);
  9.   }
  10.  
  11.   private function init(event:Event):void
  12.   {
  13.       trace(stage.stageWidth);
  14.   }
  15. }

Información mas detallada aquí