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í

Repeater, diferencia currentItem y getRepeaterItem

Octubre 3rd, 2007

Una mas. A la hora de hacer un repeater para pasar los datos a los componentes del repeater se usa currentItem mientras se está ejecutando (dibujando) pero para mantener la interación una vez realizado hay que usar getRepeaterItem.

Para muestra un botón.

CODE:
  1. <mx:Repeater id="rep" dataProvider="{datos}">
  2.         <mx:Button label="{rep.currentItem.nombre}"
  3.          click="doClick(event.currentTarget.getRepeaterItem().id);" />
  4. </mx:Repeater>

El dataProvider que uso tendría dos valores por entrada una nombre y otra id.

SVG en AS3

Septiembre 25th, 2007

Para un proyecto que estoy realizando he necesito utilizar el SVG y he desarrollado una librería para dibujarlo en tiempo de ejecución. Necesita todavía incluir muchas partes pero ya interpreta todos los comandos de dibujo y sus transformaciones. El siguiente paso es integrarle el texto.

Aquí un ejemplo de un SVG interpretado de un archivo de la página Croczilla


Presiona.com

Septiembre 3rd, 2007

Comienza la presión!!

Este es un proyecto en el que he estado trabajando durante los últimos meses, tanto en labores de diseño como de programación.

Puede ser una nueva forma de comprar, agrupándose para conseguir el mejor precio. Todo un experimento.

www.presiona.com

PopUpManager y los nombres de las clases

Mayo 11th, 2007

A la hora de usar componentes Flex a través del popUpManager no tenemos ningún problema si el componente se encuentra en el raiz del proyecto ya que el nombre de la clase que se usa al hacer el createPopUp es encontrado. Pero si los componentes están en otra carpeta, por ejemplo "componentes" nos darán un error a la hora de compilar.

El siguiente código dará error.

CODE:
  1. var pop= mx.managers.PopUpManager.createPopUp(this,myComp,true);

Para solucionar este problema si por ejemplo el componente está en la carpeta "componentes" deberemos de hacer una llamada a la clase para que se incluya en el tiempo de compilación.

CODE:
  1. //antes de la llamada del popUpManager
  2. //incluiremos la llamada.
  3. componentes.myComp;
  4. var pop= mx.managers.PopUpManager.createPopUp(this,myComp,true);

Datagrid.itemClick para seleccionar items

Abril 29th, 2007

En un DataGrid existen muchos eventos que nos pueden ayudar a la hora de seleccionar la información que aparece, el click y el change funcionan para vigilar los cambios sobre todo el DataGrid pero para saber si se ha pulsado sobre un item existe el evento itemClick.

CODE:
  1. <mx:DataGrid itemclick="itemPulsado(event);" />

Lo único que hay que vigilar es que también se activa si pulsamos sobre el header del DataGrid así que en la función deberemos de comprobar si se ha pulsado realmente sobre un item comprobando si rowIndex es mayor de 0.

CODE:
  1. private funcion intemPulsado(event:ListEvent):void
  2. {
  3.     if (event.rowIndex>0)
  4.     {
  5.         // ......
  6.         // Lógica sobre lo que ha de pasar al pulsar el item
  7.     }
  8. }

Información encontrada en Flexcoders

Actualización:
He subido un ejemplo para ver el funcionamiento. Código fuente incluido.

Ver ejemplo.

Custom Events

Marzo 27th, 2007

Otra cosa mas que se me olvida de una vez para otra:

Para crear eventos entre los componentes de Flex, se pueden crear Custom Events entre ellos.

Aquí viene muy clarito.

Se resume en que en el componente se define el evento:

CODE:
  1. <mx:Metadata>
  2.     [Event(name="correcto", type="flash.events.Event")]
  3. </mx:Metadata>

Y luego se hace la llamada al mismo:

CODE:
  1. public function cambio():void {
  2.     this.dispatchEvent(new Event("correcto"));
  3. }

y en donde se utilice este componente ya se podrá esperar a que este evento sea llamado para realizar la interacción que corresponda:

CODE:
  1. <com:componente id="tecla1" correcto="teclapulsada();"/>

ObjectUtil.copy

Marzo 15th, 2007

Dentro de mx.utils.ObjectUtil existe el comando copy que realmente hace eso, copiar un objeto en otro, parece algo sencillo pero realmente más sencillo parecía que para copiar un objeto se pudiera hacer mediante objeto2=objeto1, pero en Flex esto asigna el valor de objeto1 a objeto2 pero tambien lo une de forma que las modificaciones sobre objeto2 se hacen también sobre objeto1 (Two Way Data Binding).

De esta forma podemos seleccionar un objeto en un DataGrid y editar el objeto seleccionado pudiendo si lo deseamos deshacer los cambios y volver al objeto original ya que no lo estaremos modificando.

Aplicación de ejemplo:

CODE:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
  3.     <mx:Script>
  4.         <![CDATA[
  5.        
  6.                 import mx.utils.ObjectUtil;
  7.        
  8.             [Bindable]
  9.             private var empleadoActivo:Object;
  10.  
  11.             private function muestraFicha():void {
  12.                 empleadoActivo=ObjectUtil.copy(listaEmpleados.selectedItem);
  13.             }
  14.  
  15.             private function guarda():void {
  16.                 empleadosAC.setItemAt(empleadoActivo, listaEmpleados.selectedIndex);
  17.             }
  18.         ]]>
  19.     </mx:Script>
  20.        <mx:ArrayCollection id="empleadosAC">
  21.       <mx:source>
  22.          <mx:Object nombre="Nombre1" dato="dato1"/>
  23.          <mx:Object nombre="Nombre2" dato="dato2"/>
  24.          <mx:Object nombre="Nombre3" dato="dato3"/>
  25.       </mx:source>
  26.    </mx:ArrayCollection>
  27.    <mx:DataGrid dataProvider="{empleadosAC}" id="listaEmpleados"
  28. click="muestraFicha()">
  29.         <mx:columns>
  30.             <mx:DataGridColumn headerText="Nombre" dataField="nombre"/>
  31.             <mx:DataGridColumn headerText="Dato" dataField="dato"/>
  32.         </mx:columns>
  33.    </mx:DataGrid>
  34.     <mx:TextInput id="text1" text="{empleadoActivo.nombre}" change="empleadoActivo.nombre=event.target.text;"/>
  35.     <mx:TextInput id="text2" text="{empleadoActivo.dato}" change="empleadoActivo.dato=event.target.text;"/>
  36.     <mx:Button id="guardar" label="Guardar" click="guarda()" />
  37. </mx:Application>

Esta aplicación hace una copia del objeto cuando se edita, si queremos ver el cambio al hacerlo sin el ObjectUtil.copy no tenemos más que sustituir la línea:

empleadoActivo=ObjectUtil.copy(listaEmpleados.selectedItem);

por:

empleadoActivo=listaEmpleados.selectedItem;

Al hacer cambios sobre empleadoActivo esos cambios se verán reflejados en el dataGrid. El cambio no se ve al instante ya que el DataGrid no se actualiza, pero reordena el DataGrid y sorpresa!!!

… args

Marzo 14th, 2007

Esto luego seguro que lo necesito y no lo encuentro.

Se trata de la forma de pasar un número ilimitado de parametros a una función, se pueden definir los parametros fijos que se quieran y luego dejar mediante (... args) que se puedan pasar mas parametros.

CODE:
  1. function traceArgArray(x: int, ... args)
  2. {
  3.     for (var i:uint = 0; i <args.length; i++)
  4.     {
  5.         trace(args[i]);
  6.     }
  7. }

Esta en la ayuda de flex. Ver ayuda

DragManager error en recarga de Modules

Febrero 26th, 2007

Al utilizar los modules y hacer varias cargas con modulos que contienen elementos que utilizan el DragManager dan el siguiente error:

Error!!!

Esto se soluciona si se incluye el DragManager en la aplicación principal y se inicia, así ya está disponible para todos los modulos.

CODE:
  1. import mx.managers.DragManager;
  2. private var dm:DragManager;

Lo encontré buscado por Flexcoders y la solución en Flexcomponents