<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2586793280141583336</id><updated>2011-09-28T14:33:19.349+01:00</updated><category term='arte'/><category term='General'/><category term='flex'/><title type='text'>Gonzalo Pezzi. Rich Internet Applications.</title><subtitle type='html'>Inquietudes y reflexiones sobre el mundo de las Rich Internet Applications.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gonzalopezzi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gonzalopezzi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gonzalo Pezzi</name><uri>http://www.blogger.com/profile/13510431558827772284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_EwmuJ8b4ilY/SNwVB1gkLwI/AAAAAAAAABE/2yw7I_1VXoA/S220/yo.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2586793280141583336.post-5521894026682558739</id><published>2007-09-25T09:58:00.000+01:00</published><updated>2007-09-25T10:08:38.824+01:00</updated><title type='text'>Reflection en ActionScript 3</title><content type='html'>Los lenguajes orientados a objetos suelen incorporar mecanismos para conocer información de los objetos en tiempo de ejecución. Actionscript no es una excepción.&lt;br /&gt;El concepto de Reflection en lenguajes orientados a objetos no tiene nada que ver con el conocido efecto gráfico que muestra un reflejo de un componente.&lt;br /&gt;Se trata una técnica de programación que permite crear clases, invocar métodos y acceder a variables incluso cuando no sabemos los nombres de las clases,&lt;br /&gt;métodos o propiedades hasta el momento de la ejecución.&lt;br /&gt;Utilizando Reflection podemos crear componentes totalmente genéricos, que funcionen con cualquier tipo de objeto.&lt;br /&gt;&lt;br /&gt;Si eres programador de java, seguramente te suene el paquete java.lang.Reflect que se utiliza para hacer este tipo de cosas.&lt;br /&gt;&lt;br /&gt;Vamos a ver los conceptos básicos de las técnicas de &lt;i&gt;Reflection&lt;/i&gt; en ActionScript y &lt;a href="http://gonzinger.s41.eatj.com/asreflection" target="_blank"&gt;un sencillo ejemplo&lt;/a&gt; para que veáis en código cómo se hace.&lt;br /&gt;Las funciones básicas para realizar reflection en actionscript se encuentran en el paquete flash.utils y nos permiten recuperar un xml que contiene toda la información del objeto:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Nombre de la clase del objeto&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Clase de la que hereda&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Si se trata de un objeto dynamic, final o static&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Las variables del objeto&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Los métodos de acceso (comunmente llamados getters y setters)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Métodos del objeto&lt;/li&gt;&lt;br /&gt;&lt;li&gt;... etc&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;También contamos con técnicas para crear clases cuyos nombres no conocemos hasta el momento de la ejecución. Así como invocar métodos o acceder a propiedades. Todo ello recuperando la información en tiempo de ejecución. &lt;/p&gt;&lt;p&gt;Con esta técnica podemos hacer componentes y aplicaciones totalmente genéricas y aplicables a cualquier tipo de objeto.&lt;br /&gt;&lt;br /&gt;Muchos componentes del framework de flex utilizan algunas técnicas de reflection, por ejemplo el DataGrid.&lt;br /&gt;Un datagrid no conoce el tipo de objeto que va a albergar hasta el momento de la ejecución.&lt;br /&gt;Nosotros le indicamos en tiempo de compilación los dataField (los nombres de las propiedades).&lt;br /&gt;Es en el momento de la ejecución cuando el datagrid recupera esas propiedades de los objetos que contiene,&lt;br /&gt;independientemente de la clase de los objetos.&lt;br /&gt;&lt;br /&gt;En actionScript, recuperar el valor de una variable de un objeto es realmente sencillo. Basta con tratar el objeto como si se tratase de un array asociativo, donde el índice es el nombre de la propiedad:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;objeto ["nombreVariable"] &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Recuperar información sobre un objeto es un poco más complicado. La función flash.utils.describeType devuelve un XML con información sobre el objeto&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;describeType (objeto) &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Veamos un ejemplo. Tenemos la siguiente clase:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;package com.gonzalopezzi.asreflection.vos&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;public class Persona&lt;br /&gt;{&lt;br /&gt;public function Persona () {&lt;br /&gt;_id = (new Date ()).time;&lt;br /&gt;}&lt;br /&gt;private var _id : Number; // Esta propiedad es de sólo lectura (ver getter)&lt;br /&gt;public var nombre : String;&lt;br /&gt;public var apellidos : String;&lt;br /&gt;public var nif : String;&lt;br /&gt;public var fechaNacimiento : Date;&lt;br /&gt;public var telefono : String;&lt;br /&gt;public var prioridad : Number;&lt;br /&gt;public function get id () : Number {&lt;br /&gt;return _id;&lt;br /&gt;}&lt;br /&gt;public function dummy (a : Number, b : String) : String {&lt;br /&gt;return "dummy";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Veamos qué ocurre si invocamos la función describeType con una instancia de esa clase. Obtenemos el siguiente xml:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&amp;lt;type name="com.gonzalopezzi.asreflection.vos::Persona" base="Object" isDynamic="false" isFinal="false" isStatic="false"&amp;gt;&lt;br /&gt;  &amp;lt;extendsClass type="Object"/&amp;gt;&lt;br /&gt;  &amp;lt;variable name="fechaNacimiento" type="Date"/&amp;gt;&lt;br /&gt;  &amp;lt;variable name="nif" type="String"/&amp;gt;&lt;br /&gt;  &amp;lt;variable name="apellidos" type="String"/&amp;gt;&lt;br /&gt;  &amp;lt;method name="dummy" declaredBy="com.gonzalopezzi.asreflection.vos::Persona" returnType="String"&amp;gt;&lt;br /&gt;    &amp;lt;parameter index="1" type="Number" optional="false"/&amp;gt;&lt;br /&gt;    &amp;lt;parameter index="2" type="String" optional="false"/&amp;gt;&lt;br /&gt;  &amp;lt;/method&amp;gt;&lt;br /&gt;  &amp;lt;variable name="prioridad" type="Number"/&amp;gt;&lt;br /&gt;  &amp;lt;variable name="telefono" type="String"/&amp;gt;&lt;br /&gt;  &amp;lt;variable name="nombre" type="String"/&amp;gt;&lt;br /&gt;  &amp;lt;accessor name="id" access="readonly" type="Number" declaredBy="com.gonzalopezzi.asreflection.vos::Persona"/&amp;gt;&lt;br /&gt;&amp;lt;/type&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Con ese objeto XML y con la ayuda de sencillos operadores E4X, podemos conocer de forma instantánea toda la información que necesitamos de un objeto en tiempo de ejecución.&lt;br /&gt;&lt;br /&gt;Pero nos falta algo. Todavía no sabemos cómo instanciar un objeto de una clase cuyo nombre no conocemos hasta el momento de la ejecución. Es sencillo. Veamos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var clase : Class = getDefinitionByName(nombreClase) as Class;&lt;br /&gt;var p : Object = new clase ();&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;¡Pero cuidado! Aquí nos encontramos con una gran limitación. Si intentamos ejecutar esto y le pasamos un nombre de clase que no se referencia en ningún lugar de la aplicación, vamos a obtener&lt;br /&gt;un error. ¿Por qué ocurre esto? El compilador intenta economizar el peso del swf compilado. Para ello, no incluirá en la compilación las clases que no se usen, aunque estén dentro de nuestra carpeta de fuentes.&lt;br /&gt;&lt;br /&gt;Típica pregunta: ¿Y si pongo un import para importar esa clase? ... así no hacemos nada. Aunque tengamos el import, si no hemos instanciado una variable de esa clase, no conseguiremos nada.&lt;br /&gt;&lt;br /&gt;La solución: crear una clase con variables de los tipos que sabemos que podremos instanciar en tiempo de ejecución e instanciar esa clase en algún lugar de nuestro código. (ver clase &lt;b&gt;ClassLinker&lt;/b&gt; en el ejemplo)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gonzinger.s41.eatj.com/asreflection" target="_blank"&gt;Aquí&lt;/a&gt; tenéis un pequeño ejemplo para que podáis ver todo esto en acción.&lt;br /&gt;&lt;br /&gt;Las posibilidades de este tipo de técnicas son muy variadas y potentes. Podemos mejorar la productividad de nuestro equipo de desarrollo si creamos componentes y código que utilice objetos de forma genérica. Podremos crear también, aplicaciones mucho más flexibles y adaptables orientando nuestro desarrollo a la creación de interfaces con métodos bien definidos, enlazando las clases de implementación de las interfaces en tiempo de ejecución. Este tipo de técnicas constituyen un punto de partida esencial para motores de inyección de dependencias (también conocido como IoC, o Inversión de Control).&lt;br /&gt;&lt;br /&gt;El desarrollo de aplicaciones web vuelve a ser divertido. Disfrutad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2586793280141583336-5521894026682558739?l=gonzalopezzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gonzalopezzi.blogspot.com/feeds/5521894026682558739/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2586793280141583336&amp;postID=5521894026682558739' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/5521894026682558739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/5521894026682558739'/><link rel='alternate' type='text/html' href='http://gonzalopezzi.blogspot.com/2007/09/reflection-en-actionscript-3.html' title='Reflection en ActionScript 3'/><author><name>Gonzalo Pezzi</name><uri>http://www.blogger.com/profile/13510431558827772284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_EwmuJ8b4ilY/SNwVB1gkLwI/AAAAAAAAABE/2yw7I_1VXoA/S220/yo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2586793280141583336.post-4290984943593093046</id><published>2007-01-03T18:32:00.000+01:00</published><updated>2007-01-03T19:16:22.057+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arte'/><title type='text'>Arte</title><content type='html'>&lt;a href="http://bp2.blogger.com/_EwmuJ8b4ilY/RZvqBZqoixI/AAAAAAAAAAk/Tnmj-qYB3Yo/s1600-h/Tronco.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5015859919797652242" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp2.blogger.com/_EwmuJ8b4ilY/RZvqBZqoixI/AAAAAAAAAAk/Tnmj-qYB3Yo/s320/Tronco.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:arial;"&gt;Una de mis aficiones son la pintura y el diseño gráfico.&lt;br /&gt;Acabo de terminar esto. Es un paisaje basado en unas fotos que tomé hace tiempo en un bosque. (Pinchad en la imagen para verla en mejor resolución) &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Si queréis ver algunos ejemplos más, entrad en &lt;a href="http://gonzinger.deviantart.com"&gt;mi dirección de deviantart&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2586793280141583336-4290984943593093046?l=gonzalopezzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gonzalopezzi.blogspot.com/feeds/4290984943593093046/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2586793280141583336&amp;postID=4290984943593093046' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/4290984943593093046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/4290984943593093046'/><link rel='alternate' type='text/html' href='http://gonzalopezzi.blogspot.com/2007/01/arte.html' title='Arte'/><author><name>Gonzalo Pezzi</name><uri>http://www.blogger.com/profile/13510431558827772284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_EwmuJ8b4ilY/SNwVB1gkLwI/AAAAAAAAABE/2yw7I_1VXoA/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_EwmuJ8b4ilY/RZvqBZqoixI/AAAAAAAAAAk/Tnmj-qYB3Yo/s72-c/Tronco.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2586793280141583336.post-1891971509181378332</id><published>2006-12-31T13:15:00.000+01:00</published><updated>2006-12-31T13:18:55.642+01:00</updated><title type='text'>Cómo crear componentes en Flex 2</title><content type='html'>&lt;a href="http://www.danonino.org/" target="_blank"&gt;&lt;span style="font-family:arial;"&gt;Dano&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; ha subido el primero de doce artículos que publicará a lo largo de 2007 sobre la tecnología Adobe Flex. En este caso nos explica &lt;/span&gt;&lt;a href="http://www.cristalab.com/tips/32965/como-crear-componentes-en-flex-2"&gt;&lt;span style="font-family:arial;"&gt;cómo hacer componentes Flex&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. Un artículo muy bueno y didáctico. No os lo perdáis.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2586793280141583336-1891971509181378332?l=gonzalopezzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gonzalopezzi.blogspot.com/feeds/1891971509181378332/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2586793280141583336&amp;postID=1891971509181378332' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/1891971509181378332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/1891971509181378332'/><link rel='alternate' type='text/html' href='http://gonzalopezzi.blogspot.com/2006/12/dano-ha-publicado-el-primero-de-doce.html' title='Cómo crear componentes en Flex 2'/><author><name>Gonzalo Pezzi</name><uri>http://www.blogger.com/profile/13510431558827772284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_EwmuJ8b4ilY/SNwVB1gkLwI/AAAAAAAAABE/2yw7I_1VXoA/S220/yo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2586793280141583336.post-7621478704906006367</id><published>2006-12-30T12:16:00.000+01:00</published><updated>2006-12-30T12:56:39.594+01:00</updated><title type='text'>Internacionalización de aplicaciones Flex</title><content type='html'>&lt;span style="font-family:arial;"&gt;En J2EE es habitual crear aplicaciones multi-idioma. Los frameworks de desarrollo de aplicaciones web J2EE incluyen mecanismos para hacer páginas multilingües sin demasiado esfuerzo.&lt;br /&gt;Además de la internacionalización, cuando se programa de esta forma, se observa una gran ventaja: tendremos una gran flexibilidad durante el mantenimiento al tener todos los textos de nuestra aplicación centralizados en ficheros (.properties, habitualmente). Los clientes son caprichosos con los textos que aparecen en las aplicaciones y en ocasiones algunos textos resultan confusos para los usuarios y necesitan ser modificados.&lt;br /&gt;En aplicaciones Flex surgen ciertos problemas a la hora de implementar la internacionalización:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;A diferencia de J2EE, las páginas que se muestran no se preparan dinámicamente en el servidor para un usuario concreto. En nuestro caso tenemos una aplicación cliente compilada en un fichero ".swf". Por lo tanto, lo lógico es que los textos de la aplicación estén dentro de ese "swf".&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Incluir todos los idiomas dentro del mismo "swf" repercute en el tamaño de la aplicación cliente descargada por el usuario.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;En consecuencia, habrá que recuperar los textos de la aplicación en tiempo de compilación y compilar la aplicación cliente para cada idioma al que queramos dar soporte.&lt;br /&gt;Flex incluye mecanismos para este propósito. Veamos un pequeño ejemplo: &lt;/span&gt;&lt;br /&gt;&lt;div class="divConScroll"&gt;&lt;br /&gt;&lt;table width="800"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="mxmlCdata"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="mxmlComponent"&gt;&amp;lt;mx:Application&lt;/span&gt; xmlns:mx=&amp;quot;&lt;span class="mxmlString"&gt;http://www.adobe.com/2006/mxml&lt;/span&gt;&amp;quot; &lt;br /&gt;        layout=&amp;quot;&lt;span class="mxmlString"&gt;vertical&lt;/span&gt;&amp;quot; verticalAlign=&amp;quot;&lt;span class="mxmlString"&gt;middle&lt;/span&gt;&amp;quot; &lt;br /&gt;        horizontalAlign=&amp;quot;&lt;span class="mxmlString"&gt;center&lt;/span&gt;&amp;quot; viewSourceURL=&amp;quot;&lt;span class="mxmlString"&gt;sourceview/index.html&lt;/span&gt;&amp;quot;&lt;span class="mxmlComponent"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Panel&lt;/span&gt; width=&amp;quot;&lt;span class="mxmlString"&gt;320&lt;/span&gt;&amp;quot; height=&amp;quot;&lt;span class="mxmlString"&gt;200&lt;/span&gt;&amp;quot;&lt;span class="mxmlComponent"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Label&lt;/span&gt; text=&amp;quot;&lt;span class="mxmlString"&gt;@Resource(bundle'mensajesAplicacion', key='saludo')&lt;/span&gt;&amp;quot;&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="mxmlComponent"&gt;&amp;lt;/mx:Panel&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;&lt;span class="mxmlComponent"&gt;&amp;lt;/mx:Application&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Parece fácil, ¿verdad? Bueno, es que en realidad ahí no acaba todo. &lt;br /&gt;Habéis visto que hemos hecho referencia a un bundle que se llama &lt;strong&gt;MensajesAplicacion&lt;/strong&gt;, pues bien, tendremos en algún lugar de nuestro sistema de archivos una carpeta &lt;strong&gt;resources&lt;/strong&gt; que contiene a su vez una carpeta para cada idioma (en_US, fr_FR ...). Dentro de cada carpeta de idioma, meteremos un fichero &lt;strong&gt;MensajesAplicacion.properties&lt;/strong&gt; traducido. &lt;br /&gt;Ya sólo queda una cosa: tendremos que indicar al compilador qué idioma para compilar:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier;"&gt;&lt;br /&gt;-locale es_ES -sp C:\SRC\resourceBundle\resources\{locale}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Espero que os sirva de ayuda. Muchas gracias por vuestra atención. &lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2586793280141583336-7621478704906006367?l=gonzalopezzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gonzalopezzi.blogspot.com/feeds/7621478704906006367/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2586793280141583336&amp;postID=7621478704906006367' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/7621478704906006367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/7621478704906006367'/><link rel='alternate' type='text/html' href='http://gonzalopezzi.blogspot.com/2006/12/en-j2ee-es-habitual-crear-aplicaciones.html' title='Internacionalización de aplicaciones Flex'/><author><name>Gonzalo Pezzi</name><uri>http://www.blogger.com/profile/13510431558827772284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_EwmuJ8b4ilY/SNwVB1gkLwI/AAAAAAAAABE/2yw7I_1VXoA/S220/yo.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2586793280141583336.post-7494089491688584948</id><published>2006-12-26T10:56:00.000+01:00</published><updated>2006-12-26T11:07:24.828+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><title type='text'>SequenceCommand: comandos encadenados</title><content type='html'>&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Bjorn Schultheiss&lt;/strong&gt; ha publicado &lt;/span&gt;&lt;a href="http://cairngormdocs.org/blog/?p=27" target="_blank"&gt;&lt;span style="font-family:arial;"&gt;un artículo excelente sobre Commands encadenados &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;con Cairngorm.&lt;br /&gt;Para los que no conozcáis este framework, os invito a leer con detenimiento &lt;/span&gt;&lt;a href="http://www.adobe.com/devnet/flex/articles/cairngorm_pt1.html" target="_blank"&gt;&lt;span style="font-family:arial;"&gt;este tutorial&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;.&lt;br /&gt;&lt;br /&gt;Los que conocéis Cairngorm, quizá no sepáis que a partir de la versión 2.0 de Cairngorm, las clases Command heredan de &lt;strong&gt;SequenceCommand&lt;/strong&gt;. De este modo, es posible encadenar eventos de forma sequencial.&lt;br /&gt;&lt;br /&gt;Esto es muy interesante, sobretodo si queremos evitar que un cliente haga varias llamadas simultáneas a servidor, para evitar una carga excesiva del mismo.&lt;br /&gt;&lt;br /&gt;Pues bien, el uso de dichos SequenceCommand, tal y como propone Cairngorm, es un poco lioso y el resultado es un código difícil de mantener.&lt;br /&gt;&lt;br /&gt;Sin embargo, Bjorn Schultheiss ha creado una &lt;/span&gt;&lt;a href="http://cairngormdocs.org/blog/?p=27" target="_blank"&gt;&lt;span style="font-family:arial;"&gt;solución&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; muy elegante para el control secuencial de los comandos, basada en los SequenceCommand de Cairngorm.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a href="http://bp2.blogger.com/_EwmuJ8b4ilY/RZDzID28mII/AAAAAAAAAAM/zgGKP1YWlbQ/s320/EventChainDiagramRed.jpg" target="_blank"&gt;&lt;img id="BLOGGER_PHOTO_ID_5012773705063635074" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_EwmuJ8b4ilY/RZDzID28mII/AAAAAAAAAAM/zgGKP1YWlbQ/s320/EventChainDiagramRed.jpg" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2586793280141583336-7494089491688584948?l=gonzalopezzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gonzalopezzi.blogspot.com/feeds/7494089491688584948/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2586793280141583336&amp;postID=7494089491688584948' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/7494089491688584948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/7494089491688584948'/><link rel='alternate' type='text/html' href='http://gonzalopezzi.blogspot.com/2006/12/sequencecommand-comandos-encadenados.html' title='SequenceCommand: comandos encadenados'/><author><name>Gonzalo Pezzi</name><uri>http://www.blogger.com/profile/13510431558827772284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_EwmuJ8b4ilY/SNwVB1gkLwI/AAAAAAAAABE/2yw7I_1VXoA/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_EwmuJ8b4ilY/RZDzID28mII/AAAAAAAAAAM/zgGKP1YWlbQ/s72-c/EventChainDiagramRed.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2586793280141583336.post-6081682577612560130</id><published>2006-12-24T16:24:00.000+01:00</published><updated>2006-12-26T10:59:22.652+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><title type='text'>Histórico del Navegador en Flex. El "maldito" botón Atrás</title><content type='html'>&lt;pre&gt;&lt;span class="mxmlCdata"  style="font-family:arial;"&gt;Los desarrolladores de aplicaciones web tenemos una pesada herencia: el &lt;strong&gt;histórico&lt;/strong&gt; del navegador. En los principios de la web, las páginas tenían únicamente contenido estático, es decir, sólo mostraban información. &lt;br /&gt;&lt;br&gt;En este marco, resulta lógico que el navegador tenga un botón que me permita regresar a páginas que he visitado anteriormente. Con la aparición de aplicaciones web con procesamiento en servidor (CGIs, Servlets y JSPs, ASPs y demás) el usuario de Internet ha pasado a entender el botón Atrás como un botón Deshacer. &lt;br /&gt;&lt;br&gt;Este maldito botón nos ha dado algunos dolores de cabeza a más de uno, pero el &lt;strong&gt;usuario&lt;/strong&gt; de aplicaciones web está acostumbrado a usarlo y habitualmente exige que se pueda utilizar. &lt;br /&gt;&lt;br&gt;En Flex es muy sencillo controlar el histórico. &lt;a href="http://gonzinger.s41.eatj.com/historicoNavegador/historicoNavegador.html" target="_blank"&gt;Aquí&lt;/a&gt; tenéis un pequeño ejemplo. Para probarla, pulsa los botones para cambiar el estado de la aplicación (simplemente cambia un texto) y luego pulsa Atrás para volver a estados anteriores: &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="divConScroll"&gt;&lt;br /&gt;&lt;table width="800"&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="mxmlCdata"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="mxmlComponent"&gt;&amp;lt;mx:Application&lt;/span&gt; xmlns:mx="&lt;span class="mxmlString"&gt;http://www.adobe.com/2006/mxml&lt;/span&gt;"&lt;br /&gt;        layout="&lt;span class="mxmlString"&gt;vertical&lt;/span&gt;"&lt;br /&gt;        horizontalAlign="&lt;span class="mxmlString"&gt;center&lt;/span&gt;"&lt;br /&gt;        verticalAlign="&lt;span class="mxmlString"&gt;middle&lt;/span&gt;"&lt;br /&gt;        creationComplete="init&lt;span class="asBracket"&gt;()&lt;/span&gt;"&lt;br /&gt;        implements="&lt;span class="mxmlString"&gt;mx.managers.IHistoryManagerClient&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="mxmlTag"&gt;&amp;lt;mx:Script&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="asOperator"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="asBracket"&gt;[&lt;/span&gt;CDATA&lt;span class="asBracket"&gt;[&lt;/span&gt;&lt;br /&gt;            &lt;span class="asReserved"&gt;import&lt;/span&gt; mx.controls.Alert;&lt;br /&gt;  &lt;br /&gt;            &lt;span class="asReserved"&gt;import&lt;/span&gt; mx.managers.HistoryManager;&lt;br /&gt;            &lt;span class="asReserved"&gt;import&lt;/span&gt; mx.managers.IHistoryManagerClient;&lt;br /&gt;  &lt;br /&gt;            &lt;span class="asReserved"&gt;private&lt;/span&gt; &lt;span class="asReserved"&gt;const&lt;/span&gt; ESTADO_1 &lt;span class="asOperator"&gt;:&lt;/span&gt; String &lt;span class="asOperator"&gt;=&lt;/span&gt; &lt;span class="asString"&gt;"estado1"&lt;/span&gt;;&lt;br /&gt;            &lt;span class="asReserved"&gt;private&lt;/span&gt; &lt;span class="asReserved"&gt;const&lt;/span&gt; ESTADO_2 &lt;span class="asOperator"&gt;:&lt;/span&gt; String &lt;span class="asOperator"&gt;=&lt;/span&gt; &lt;span class="asString"&gt;"estado2"&lt;/span&gt;;&lt;br /&gt;            &lt;span class="asReserved"&gt;private&lt;/span&gt; &lt;span class="asReserved"&gt;const&lt;/span&gt; ESTADO_3 &lt;span class="asOperator"&gt;:&lt;/span&gt; String &lt;span class="asOperator"&gt;=&lt;/span&gt; &lt;span class="asString"&gt;"estado3"&lt;/span&gt;;&lt;br /&gt;  &lt;br /&gt;            &lt;span class="asReserved"&gt;private&lt;/span&gt; &lt;span class="asFunction"&gt;function&lt;/span&gt; init &lt;span class="asBracket"&gt;()&lt;/span&gt; &lt;span class="asOperator"&gt;:&lt;/span&gt; &lt;span class="asReserved"&gt;void&lt;/span&gt; &lt;span class="asBracket"&gt;{&lt;/span&gt;          &lt;br /&gt;                HistoryManager.register &lt;span class="asBracket"&gt;(&lt;/span&gt;&lt;span class="asReserved"&gt;this&lt;/span&gt;&lt;span class="asBracket"&gt;)&lt;/span&gt;;&lt;br /&gt;                currentState &lt;span class="asOperator"&gt;=&lt;/span&gt; ESTADO_1;&lt;br /&gt;            &lt;span class="asBracket"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;            &lt;span class="asReserved"&gt;public&lt;/span&gt; &lt;span class="asFunction"&gt;function&lt;/span&gt; &lt;span class="asReserved"&gt;set&lt;/span&gt; cambioCurrentState &lt;span class="asBracket"&gt;(&lt;/span&gt;valor &lt;span class="asOperator"&gt;:&lt;/span&gt; String&lt;span class="asBracket"&gt;)&lt;/span&gt; &lt;span class="asOperator"&gt;:&lt;/span&gt; &lt;span class="asReserved"&gt;void&lt;/span&gt; &lt;span class="asBracket"&gt;{&lt;/span&gt;      &lt;br /&gt;                HistoryManager.save &lt;span class="asBracket"&gt;()&lt;/span&gt;;&lt;br /&gt;            &lt;span class="asBracket"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;            &lt;span class="asReserved"&gt;public&lt;/span&gt; &lt;span class="asFunction"&gt;function&lt;/span&gt; loadState &lt;span class="asBracket"&gt;(&lt;/span&gt;state &lt;span class="asOperator"&gt;:&lt;/span&gt; Object&lt;span class="asBracket"&gt;)&lt;/span&gt; &lt;span class="asOperator"&gt;:&lt;/span&gt; &lt;span class="asReserved"&gt;void&lt;/span&gt; &lt;span class="asBracket"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span class="asReserved"&gt;if&lt;/span&gt; &lt;span class="asBracket"&gt;(&lt;/span&gt;state&lt;span class="asBracket"&gt;)&lt;/span&gt; &lt;span class="asBracket"&gt;{&lt;/span&gt;&lt;br /&gt;                    currentState &lt;span class="asOperator"&gt;=&lt;/span&gt; state.currentState;&lt;br /&gt;                &lt;span class="asBracket"&gt;}&lt;/span&gt;&lt;br /&gt;                &lt;span class="asReserved"&gt;else&lt;/span&gt; &lt;span class="asBracket"&gt;{&lt;/span&gt; &lt;span class="asComment"&gt;// Estado inicial&lt;br /&gt;&lt;/span&gt;                    currentState &lt;span class="asOperator"&gt;=&lt;/span&gt; ESTADO_1;&lt;br /&gt;                &lt;span class="asBracket"&gt;}&lt;/span&gt;&lt;br /&gt;            &lt;span class="asBracket"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;            &lt;span class="asReserved"&gt;public&lt;/span&gt; &lt;span class="asFunction"&gt;function&lt;/span&gt; saveState &lt;span class="asBracket"&gt;()&lt;/span&gt; &lt;span class="asOperator"&gt;:&lt;/span&gt; Object &lt;span class="asBracket"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span class="asVar"&gt;var&lt;/span&gt; state &lt;span class="asOperator"&gt;:&lt;/span&gt; Object &lt;span class="asOperator"&gt;=&lt;/span&gt; &lt;span class="asReserved"&gt;new&lt;/span&gt; Object &lt;span class="asBracket"&gt;()&lt;/span&gt;;&lt;br /&gt;                state.currentState &lt;span class="asOperator"&gt;=&lt;/span&gt; currentState;&lt;br /&gt;                &lt;span class="asReserved"&gt;return&lt;/span&gt; state;&lt;br /&gt;            &lt;span class="asBracket"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;        &lt;span class="asBracket"&gt;]]&lt;/span&gt;&lt;span class="asOperator"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="mxmlTag"&gt;&amp;lt;/mx:Script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="mxmlTag"&gt;&amp;lt;mx:Binding&lt;/span&gt; source="currentState" destination="cambioCurrentState"&lt;span class="mxmlTag"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="mxmlComponent"&gt;&amp;lt;mx:states&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;mx:State&lt;/span&gt; name="&lt;span class="mxmlString"&gt;{&lt;/span&gt;ESTADO_1&lt;span class="mxmlString"&gt;}&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;mx:State&lt;/span&gt; name="&lt;span class="mxmlString"&gt;{&lt;/span&gt;ESTADO_2&lt;span class="mxmlString"&gt;}&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;mx:State&lt;/span&gt; name="&lt;span class="mxmlString"&gt;{&lt;/span&gt;ESTADO_3&lt;span class="mxmlString"&gt;}&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="mxmlComponent"&gt;&amp;lt;/mx:states&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="mxmlComponent"&gt;&amp;lt;mx:transitions&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Transition&lt;/span&gt; fromState="&lt;span class="mxmlString"&gt;*&lt;/span&gt;" toState="&lt;span class="mxmlString"&gt;{&lt;/span&gt;ESTADO_1&lt;span class="mxmlString"&gt;}&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="mxmlComponent"&gt;&amp;lt;mx:SetPropertyAction&lt;/span&gt; target="&lt;span class="mxmlString"&gt;{&lt;/span&gt;lbl&lt;span class="mxmlString"&gt;}&lt;/span&gt;" name="&lt;span class="mxmlString"&gt;text&lt;/span&gt;" value="&lt;span class="mxmlString"&gt;Estado 1&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;/mx:Transition&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Transition&lt;/span&gt; fromState="&lt;span class="mxmlString"&gt;*&lt;/span&gt;" toState="&lt;span class="mxmlString"&gt;{&lt;/span&gt;ESTADO_2&lt;span class="mxmlString"&gt;}&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="mxmlComponent"&gt;&amp;lt;mx:SetPropertyAction&lt;/span&gt; target="&lt;span class="mxmlString"&gt;{&lt;/span&gt;lbl&lt;span class="mxmlString"&gt;}&lt;/span&gt;" name="&lt;span class="mxmlString"&gt;text&lt;/span&gt;" value="&lt;span class="mxmlString"&gt;Estado 2&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;/mx:Transition&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Transition&lt;/span&gt; fromState="&lt;span class="mxmlString"&gt;*&lt;/span&gt;" toState="&lt;span class="mxmlString"&gt;{&lt;/span&gt;ESTADO_3&lt;span class="mxmlString"&gt;}&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="mxmlComponent"&gt;&amp;lt;mx:SetPropertyAction&lt;/span&gt; target="&lt;span class="mxmlString"&gt;{&lt;/span&gt;lbl&lt;span class="mxmlString"&gt;}&lt;/span&gt;" name="&lt;span class="mxmlString"&gt;text&lt;/span&gt;" value="&lt;span class="mxmlString"&gt;Estado 3&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;/mx:Transition&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="mxmlComponent"&gt;&amp;lt;/mx:transitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Panel&lt;/span&gt; id="&lt;span class="mxmlString"&gt;pnlPrincipal&lt;/span&gt;" width="&lt;span class="mxmlString"&gt;300&lt;/span&gt;" height="&lt;span class="mxmlString"&gt;200&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Label&lt;/span&gt; id="&lt;span class="mxmlString"&gt;lbl&lt;/span&gt;" text="&lt;span class="mxmlString"&gt;Estado 1&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;mx:ControlBar&lt;/span&gt; horizontalAlign="&lt;span class="mxmlString"&gt;right&lt;/span&gt;"&lt;span class="mxmlComponent"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Button&lt;/span&gt; label="&lt;span class="mxmlString"&gt;Estado 1&lt;/span&gt;" click="currentState&lt;span class="asOperator"&gt;=&lt;/span&gt;ESTADO_1"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Button&lt;/span&gt; label="&lt;span class="mxmlString"&gt;Estado 2&lt;/span&gt;" click="currentState&lt;span class="asOperator"&gt;=&lt;/span&gt;ESTADO_2"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="mxmlComponent"&gt;&amp;lt;mx:Button&lt;/span&gt; label="&lt;span class="mxmlString"&gt;Estado 3&lt;/span&gt;" click="currentState&lt;span class="asOperator"&gt;=&lt;/span&gt;ESTADO_3"&lt;span class="mxmlComponent"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="mxmlComponent"&gt;&amp;lt;/mx:ControlBar&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="mxmlComponent"&gt;&amp;lt;/mx:Panel&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="mxmlComponent"&gt;&amp;lt;/mx:Application&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Como véis, es bastante sencillo. Además, si utilizáis &lt;strong&gt;Cairngorm&lt;/strong&gt;, gracias a que se utiliza el &lt;strong&gt;patrón Command&lt;/strong&gt; es posible guardar un histórico de los comandos que se van utilizando y de esta manera poder implementar la funcionalidad de &lt;strong&gt;deshacer/rehacer&lt;/strong&gt; con los botones Atrás/Adelante del navegador.&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2586793280141583336-6081682577612560130?l=gonzalopezzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gonzalopezzi.blogspot.com/feeds/6081682577612560130/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2586793280141583336&amp;postID=6081682577612560130' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/6081682577612560130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/6081682577612560130'/><link rel='alternate' type='text/html' href='http://gonzalopezzi.blogspot.com/2006/12/histrico-del-navegador-en-flex-el.html' title='Histórico del Navegador en Flex. El &quot;maldito&quot; botón Atrás'/><author><name>Gonzalo Pezzi</name><uri>http://www.blogger.com/profile/13510431558827772284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_EwmuJ8b4ilY/SNwVB1gkLwI/AAAAAAAAABE/2yw7I_1VXoA/S220/yo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2586793280141583336.post-1400622375133555765</id><published>2006-12-21T23:53:00.000+01:00</published><updated>2006-12-22T00:10:55.225+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Inauguración del Blog</title><content type='html'>&lt;strong&gt;Hola amigos&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Me presento: soy &lt;strong&gt;Gonzalo Pezzi&lt;/strong&gt;, autor de este Blog.&lt;br /&gt;Desde hace años, cada vez que he necesitado información sobre alguna tecnología, tutoriales o resolver algún problema relacionado con la informática, he confiado en &lt;strong&gt;&lt;span style="color:#3333ff;"&gt;S&lt;/span&gt;&lt;span style="color:#33cc00;"&gt;a&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;n&lt;/span&gt; &lt;span style="color:#3366ff;"&gt;G&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;o&lt;/span&gt;&lt;span style="color:#ffcc00;"&gt;o&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;g&lt;/span&gt;&lt;span style="color:#006600;"&gt;l&lt;/span&gt;&lt;span style="color:#cc0000;"&gt;e&lt;/span&gt;&lt;/strong&gt;. Y he de decir que en la mayoría de las ocasiones ha escuchado mis plegarias, gracias a que mucha gente en el mundo aporta su granito de arena. Por esta razón, hoy me siento en deuda con la comunidad de usuarios de Internet. Desde aquí intentaré informar de lo que ocurre en el mundo de las &lt;strong&gt;RIA&lt;/strong&gt;, y trataré también de publicar el fruto de mis investigaciones nocturnas y de fin de semana.&lt;br /&gt;&lt;br /&gt;Un saludo a todos. &lt;strong&gt;Bienvenidos&lt;/strong&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2586793280141583336-1400622375133555765?l=gonzalopezzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gonzalopezzi.blogspot.com/feeds/1400622375133555765/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2586793280141583336&amp;postID=1400622375133555765' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/1400622375133555765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2586793280141583336/posts/default/1400622375133555765'/><link rel='alternate' type='text/html' href='http://gonzalopezzi.blogspot.com/2006/12/inauguracin-del-blog.html' title='Inauguración del Blog'/><author><name>Gonzalo Pezzi</name><uri>http://www.blogger.com/profile/13510431558827772284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_EwmuJ8b4ilY/SNwVB1gkLwI/AAAAAAAAABE/2yw7I_1VXoA/S220/yo.JPG'/></author><thr:total>0</thr:total></entry></feed>
