<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Luis Adrián Rosas Wiedfeldt &#187; JSFL</title>
	<atom:link href="http://www.nomeva.com/category/jsfl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nomeva.com</link>
	<description>Pon un lego en tu vida</description>
	<lastBuildDate>Wed, 20 Jan 2010 08:34:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Tutorial JSFL &#8211; MMExecute, creación de Panel con Flex</title>
		<link>http://www.nomeva.com/2009/11/19/tutorial-jsfl-mmexecute-creacion-panel-con-flex/</link>
		<comments>http://www.nomeva.com/2009/11/19/tutorial-jsfl-mmexecute-creacion-panel-con-flex/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 07:09:31 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Paneles]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[MMExecute]]></category>
		<category><![CDATA[mxp]]></category>
		<category><![CDATA[panel]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=478</guid>
		<description><![CDATA[Bienvenidos, en esta ocasión retomaremos el tema de los Paneles pero enfocado a su creación mediante Adobe Flex. Antes o después de leer este tutorial sería interesante leer el este otro post sobre la introducción a la creación de Paneles. INTRODUCCIÓN La idea es crear un panel que nos ayude a modificar el fondo del [...]]]></description>
			<content:encoded><![CDATA[<p>Bienvenidos, en esta ocasión retomaremos el tema de los <strong><a title="Tutorial JSFL - Introducción a Paneles" href="http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank">Paneles</a></strong> pero enfocado a su creación mediante <strong><a title="Adobe Flex" href="http://www.adobe.com/es/products/flex/" target="_blank">Adobe Flex</a></strong>.</p>
<blockquote><p>Antes o después de leer este tutorial sería interesante leer el <strong><a title="Tutorial JSFL - Introducción a Paneles" href="http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank">este</a></strong> otro post sobre la introducción a la creación de <strong>Paneles</strong>.</p></blockquote>
<h1>INTRODUCCIÓN</h1>
<p>La idea es crear un panel que nos ayude a modificar el <strong>fondo</strong> del documento <strong>FLA</strong>, pero más rápidamente, si, sé que cambiar el fondo del documento es muy fácil, pero soy un poco maniático y la verdad tener que abrir una ventana, seleccionar un color y luego dar click en aceptar son muchos pasos, me gustaría algo mucho más rápido, algo como hacer <strong>rollOver</strong> sobre un componente <a title="ColorPicker Flex 3" href="http://livedocs.adobe.com/flex/3/langref/mx/controls/ColorPicker.html"><strong>ColorPicker</strong></a> y listo.</p>
<h1>DESARROLLO</h1>
<p>Para ejecutar código <a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank"><strong>JSFL</strong></a> en una película <strong>swf</strong> generada con <strong>Flex</strong> utilizaremos el método <a title="Método MMExecute" href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/adobe/utils/package.html#MMExecute()" target="_blank"><strong>MMExecute</strong></a> que encontramos en el paquete <em>adobe.utils </em>por ejemplo:</p>
<pre>import adobe.utils.MMExecute;
MMExecute("jsfl code");</pre>
<blockquote><p>El método <a title="Método MMExecute" href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/adobe/utils/package.html#MMExecute()" target="_blank"><strong>MMExecute</strong></a> recibe un parámetro de tipo <strong>String</strong> en el cual indicaremos el código <a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank"><strong>JSFL</strong></a> que deseamos ejecutar. Además devuelve un valor también de tipo <strong>String</strong> que es la representación en cadena del resultado de la ejecución del código.</p></blockquote>
<h2>Parte JSFL</h2>
<p>Vale, ahora que sabemos como ejecutar código <a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank"><strong>JSFL</strong></a> necesitamos saber que código ejecutar. Lo que queremos modificar es una propiedad del <strong>documento FLA</strong>, así es que antes que otra cosa debemos obtener una referencia al documento, esto lo hacemos con el siguiente código:</p>
<pre class="brush:js">var oDoc = fl.getDocumentDOM();</pre>
<p>Y para acceder y modificar el color de fondo utilizamos la propiedad <strong>backgroundColor</strong> que es de lectura y escritura:</p>
<pre class="brush:js">oDoc.backgroundColor</pre>
<p>Listo, por lo menos la parte de JSFL, ahora tenemos que integrar este código en una aplicación <strong>Flex</strong>.</p>
<h2 style="font-size: 1.5em;">Parte FLEX</h2>
<p>Utilizaremos un componente <strong><a title="ColorPicker Flex 3" href="http://livedocs.adobe.com/flex/3/langref/mx/controls/ColorPicker.html">ColorPicker</a></strong> este componente entre otras cosas emite los eventos:</p>
<ul>
<li>change</li>
<li>close</li>
<li>itemRollOver</li>
<li>itemRollOut</li>
<li>open</li>
</ul>
<p>Los que en nuestro caso nos interesan son los eventos <strong>change</strong> e <strong>itemRollOver</strong> así que como en cualquier otra aplicación utilizamos el siguiente código:</p>
<pre class="brush:xml">&lt;mx:ColorPicker id="cpBackgroundColor" x="89" y="10" change="onChange(event);" itemRollOver="onItemRollOver(event);" /&gt;</pre>
<p>Ahora simplemente en los métodos <strong>onChange</strong> y <strong>onItemRollOver</strong> es donde tendremos que utilizar el método MMExecute de la siguiente manera:</p>
<pre class="brush:as3">import mx.events.ColorPickerEvent;
import adobe.utils.MMExecute;

private function onChange(_oEvent:ColorPickerEvent):void
{
    if (this.isDocumentExists())
        MMExecute("fl.getDocumentDOM().backgroundColor = Number(" + _oEvent.color + ");");
}

private function onItemRollOver(_oEvent:ColorPickerEvent):void
{
    if (this.isDocumentExists())
        MMExecute("fl.getDocumentDOM().backgroundColor = Number(" + _oEvent.color + ");");
}

private function isDocumentExists():Boolean
{
    var ret:Boolean = false;
    if (MMExecute("fl.getDocumentDOM();") != "null")
        ret = true;

    return ret;
}</pre>
<h1>INSTALACIÓN</h1>
<p>Listo, el resultado no lo podremos ver en ejecución a menos que llevemos el <strong>swf</strong> resultante a la carpeta de <strong>Paneles</strong> de Flash, es decir al directorio <strong>WindowSWF</strong> dentro del directorio <strong>Configuration</strong> de la instalación.</p>
<p>Según el sistema operativo:</p>
<p><strong>Windows® VistaTM:</strong></p>
<ul>
<li>unidad de arranque\Users\nombre de usuario\Local Settings\Application Data\Adobe\Flash</li>
</ul>
<p>CS4\idioma\Configuration\</p>
<p><strong>Windows XP:</strong></p>
<ul>
<li>unidad de arranque\Documents and Settings\nombre de usuario\Local Settings\Application Data\Adobe\Flash CS4\idioma\Configuration\</li>
</ul>
<p><strong>Mac OS® X:</strong></p>
<ul>
<li>Macintosh HD/Usuarios/nombre de usuario/Librería/Application Support/Adobe/Flash</li>
</ul>
<p>CS4/idioma/Configuration/</p>
<h1>EJECUCIÓN</h1>
<p>Para ejecutar el <strong>Panel</strong> debemos acceder al menú <em><strong>Ventana -&gt; Otros paneles -&gt; Change Background Color </strong></em>a continuación un ejemplo de como ejecutar y su funcionamiento:</p>
<p><a title="Ejemplo ejecución de Panel Change Background Color." href="http://img194.yfrog.com/i/s9y.mp4/" target="_blank"><strong>Ver ejemplo</strong></a></p>
<h1>DESCARGAS</h1>
<p>Como es habitual a continuación podéis descargar los fuentes y el instalador del Panel:</p>
<ul>
<li>Fichero <strong><a title="Fichero MXML del Panel" href="http://www.nomeva.com/wp-content/uploads/2009/11/PanelChangeColor.mxml" target="_blank">MXML</a></strong> de Flex por si te interesa ver el código.</li>
<li>Fichero <strong><a title="Fichero SWF del Panel" href="http://www.nomeva.com/wp-content/uploads/2009/11/Change-Background-Color.swf" target="_blank">SWF</a><span style="font-weight: normal;"> del Panel para instalar manualmente el Panel</span></strong>.</li>
<li>Instalador <strong><a title="Instalador de la Extensión, fichero MXP" href="http://www.nomeva.com/wp-content/uploads/2009/11/PanelChangeColor.mxp" target="_blank">MXP</a></strong> del Panel para instalar automáticamente la extensión.</li>
</ul>
<p>Saludos, cualquier duda o comentario será bienvenido.</p>
<h3>Entradas relacionadas</h3>
<ul>
<li><a title="Recursos JSFL en nomeva.com" href="../category/2008/08/24/recursos-jsfl/" target="_blank">Recursos JSFL</a></li>
<li><a title="Tutorial JSFL - Introducción a comandos" href="../category/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">Tutorial JSFL – Introducción a comandos</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica" href="../category/2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/" target="_blank">Tutorial JSFL – Comandos con interfaz gráfica</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica II" href="../category/2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/" target="_blank">Tutorial JSFL – Comandos con interfaz gráfica II</a></li>
<li><a title="Tutorial JSFL - Introducción a Paneles" href="../category/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank"><strong>Tutorial JSFL – Introducción a Paneles</strong></a></li>
<li><a title="Tutorial JSFL - Panel Auto Save" href="../category/2009/06/28/tutorial-jsfl-panel-auto-save/" target="_blank"><strong>Tutorial JSFL – Panel Auto Save</strong></a></li>
<li><a title="Tutorial JSFL - Guardar copia FLA 1/2 (comando)" href="../category/2009/07/05/tutorial-jsfl-guardar-copia-fla-12-comando/" target="_blank">Tutorial JSFL – Guardar copia FLA 1/2 (comando)</a></li>
<li><a title="Tutorial JSFL - Introducción a herramientas (tools)" href="../2009/07/17/tutorial-jsfl-introduccion-herramientas-tools/" target="_blank">Tutorial JSFL – Introducción a herramientas (tools)</a></li>
<li><a title="Tutorial JSFL - Localización de contenidos (comando)" href="http://www.nomeva.com/2009/11/11/tutorial-jsfl-localizacion-de-contenidos-comando/" target="_blank">Tutorial JSFL &#8211; Localización de contenidos (comando)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2009/11/19/tutorial-jsfl-mmexecute-creacion-panel-con-flex/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL &#8211; Embeber fuentes y panel Historial</title>
		<link>http://www.nomeva.com/2009/11/13/tutorial-jsfl-embeber-fuentes-y-panel-historial/</link>
		<comments>http://www.nomeva.com/2009/11/13/tutorial-jsfl-embeber-fuentes-y-panel-historial/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 08:09:41 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[embeber fuentes]]></category>
		<category><![CDATA[panel historial]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=460</guid>
		<description><![CDATA[INTRODUCCIÓN El objetivo de JSFL es ayudar a agilizar el proceso de edición en Adobe Flash Professional. Pero, ¿qué quiere decir esto? bueno, eso nos lo responde la ayuda de Ampliación de Flash CS4 Professional con ejemplos tales como automatizar tareas repetitivas o la creación de herramientas personalizadas. La API JavaScript permite escribir scripts para [...]]]></description>
			<content:encoded><![CDATA[<h1>INTRODUCCIÓN</h1>
<p>El objetivo de <strong><a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank">JSFL</a></strong> es ayudar a <strong>agilizar el proceso de edición</strong> en <strong><a title="Adobe Flash Professional" href="http://www.nomeva.com/category/jsfl/" target="_blank">Adobe Flash Professional</a></strong>. Pero, ¿qué quiere decir esto? bueno, eso nos lo responde la <strong><a title="Ampliación de Adobe Flash CS4 Professional" href="http://www.nomeva.com/2008/10/05/flash-cs4-extendiendo-con-jsfl/" target="_blank">ayuda de Ampliación de Flash CS4 Professional</a></strong> con ejemplos tales como automatizar tareas repetitivas o la creación de herramientas personalizadas.</p>
<blockquote><p>La API JavaScript permite escribir scripts para aplicaciones Flash que ayudan a agilizar el proceso de edición. Por ejemplo, se pueden escribir scripts para automatizar tareas repetitivas o añadir herramientas personalizadas al panel Herramientas.</p></blockquote>
<h1>TUTORIAL</h1>
<p>En este tutorial vamos a ver como <strong>automatizar</strong> una tarea muy habitual y repetitiva en el día a día de un <strong>desarrollador / diseñador Flash</strong>. Vamos a ver como crear un <strong>comando</strong> para <strong>embeber caracteres</strong> a un campo de texto dinámico y además vamos a ver como utilizar el <strong>Panel Historial</strong>.</p>
<p>Primero abriremos el <strong>Panel Historial</strong>, esto lo hacemos desde el menú <strong>Ventana -&gt; Otros paneles -&gt; Historial</strong> o con los atajos de teclado <strong>Ctr + F10</strong> en Windows y <strong>Cmd + F10</strong> en Mac OS X.</p>
<p style="text-align: center; "><a style="text-decoration: none;" href="http://www.nomeva.com/wp-content/uploads/2009/11/panel_historial_adobe_flash.png"><br style="text-decoration: underline;" /><img class="aligncenter size-full wp-image-461" title="panel historial adobe flash" src="http://www.nomeva.com/wp-content/uploads/2009/11/panel_historial_adobe_flash.png" alt="panel historial adobe flash" width="466" height="259" /></a></p>
<p>Ahora comprobaremos el estado de visualización del Panel, debe estar en <strong>&#8220;JavaScript del panel&#8221;</strong>, si no es así lo modificamos.</p>
<p style="text-align: center; "><a href="http://www.nomeva.com/wp-content/uploads/2009/11/visualizacion_panel_historial_adobe_flash.png"><img class="aligncenter size-medium wp-image-464" title="visualizacion panel historial adobe flash" src="http://www.nomeva.com/wp-content/uploads/2009/11/visualizacion_panel_historial_adobe_flash-300x90.png" alt="visualizacion panel historial adobe flash" width="300" height="90" /></a></p>
<p>Ahora si con el <strong>Panel</strong> abierto haremos esa tarea tan repetitiva que es <strong>embeber fuentes</strong> en un campo de texto dinámico. Para esto hacemos lo siguiente:</p>
<ul>
<li><strong>Creamos</strong> un <strong>campo de texto</strong> con la <strong>herramienta texto</strong>.</li>
<li><strong>Volvemos dinámico</strong> el campo de texto utilizando el <strong>Panel de propiedades</strong>.</li>
<li>Seleccionamos en el desplegable de <strong>Suavizado</strong> la opción &#8220;<strong>Suavizado para animación</strong>&#8220;.</li>
</ul>
<p style="text-align: center; "><a href="http://www.nomeva.com/wp-content/uploads/2009/11/panel_propiedades_texto_adobe_flash.png"><img class="aligncenter size-full wp-image-466" title="panel propiedades texto adobe flash" src="http://www.nomeva.com/wp-content/uploads/2009/11/panel_propiedades_texto_adobe_flash.png" alt="panel propiedades texto adobe flash" width="317" height="441" /></a></p>
<ul>
<li>Hacemos <strong>click</strong> en el <strong>botón</strong> &#8220;<strong>Incorporación de caracteres…</strong>&#8220;.</li>
<li>En la ventana que se abre <strong>seleccionamos</strong> los <strong>juegos de caracteres</strong> a embeber.</li>
<li>En el campo de texto añadimos los <strong>caracteres especiales</strong>, tales como letras con tildes, diéresis, ñ y ç entre otros.</li>
</ul>
<p style="text-align: center; "><a href="http://www.nomeva.com/wp-content/uploads/2009/11/incorporacion_de_caracteres_adobe_flash.png"><img class="aligncenter size-full wp-image-465" title="incorporacion de caracteres adobe flash" src="http://www.nomeva.com/wp-content/uploads/2009/11/incorporacion_de_caracteres_adobe_flash.png" alt="incorporacion de caracteres adobe flash" width="505" height="539" /></a></p>
<p>Aceptamos y listo ya tenemos nuestro <strong>campo de texto dinámico</strong> con las<strong> fuentes embebidas</strong>, ahora nos vamos al <strong>Panel Historial</strong> y veremos todo lo que hemos estado haciendo, pero con el pequeño añadido que ahora veremos el <strong>código JSFL</strong> que tenemos que utilizar en nuestro comando.</p>
<p style="text-align: center; "><a href="http://www.nomeva.com/wp-content/uploads/2009/11/panel_historial_comandos_embedfonts_adobe_flash.png"><img class="aligncenter size-full wp-image-467" title="panel historial comandos embed fonts adobe flash" src="http://www.nomeva.com/wp-content/uploads/2009/11/panel_historial_comandos_embedfonts_adobe_flash.png" alt="panel historial comandos embed fonts adobe flash" width="466" height="259" /></a></p>
<p>En la parte inferior derecha del <strong>Panel Historial</strong> tenemos el <strong>botón Guardar</strong>, éste se activa cuando seleccionamos alguna línea de código, en este caso lo que queremos hacer es guardar las líneas de código en las que indicamos al campo de texto que utilice <strong>Suavizado para animación</strong>, los <strong>juegos de caracteres</strong> y los <strong>caracteres especiales</strong>. Así que una vez seleccionadas hacemos click en el <strong>botón Guardar</strong> y ahora simplemente tenemos que <strong>escribir</strong> el <strong>nombre del comando</strong>.</p>
<p style="text-align: center; "><a href="http://www.nomeva.com/wp-content/uploads/2009/11/ventana_guardar_como_comando_adobe_flash.png"><img class="aligncenter size-full wp-image-468" title="ventana guardar como comando adobe flash" src="http://www.nomeva.com/wp-content/uploads/2009/11/ventana_guardar_como_comando_adobe_flash.png" alt="ventana guardar como comando adobe flash" width="537" height="219" /></a></p>
<p>Listo, con esto <strong>hemos creado</strong> un <strong>comando</strong> sin tener que picar nada de código, es una forma muy simple y eficiente con la que <strong>cualquiera puede crear comandos sin necesidad de saber programar</strong>.</p>
<p>Ahora para ejecutar el comando simplemente vamos al menú <strong>Comandos</strong> y seleccionamos de la lista el comando que hemos creado, <strong>Embeber caracteres</strong>.</p>
<p style="text-align: center;"><a href="http://www.nomeva.com/wp-content/uploads/2009/11/menu_comandos_comando_embeber_caracteres_adobe_flash.png"><img class="size-full wp-image-469 aligncenter" title="menu comandos comando embeber caracteres adobe flash" src="http://www.nomeva.com/wp-content/uploads/2009/11/menu_comandos_comando_embeber_caracteres_adobe_flash.png" alt="menu comandos comando embeber caracteres adobe flash" width="366" height="210" /></a></p>
<h1>DESCARGAS</h1>
<p>Como es habitual dejo descargas del fichero <strong>JSFL </strong>y también del fichero <strong>MXP</strong> para instalar el comando.</p>
<ul>
<li><a title="Comando - Embeber caracteres" href="http://www.nomeva.com/wp-content/uploads/2009/11/embeber_caracteres.jsfl" target="_blank"><strong>Comando</strong></a> Embeber caracteres (versión JSFL).</li>
<li><a title="Instalador MXP - Comando Embeber caracteres" href="http://www.nomeva.com/wp-content/uploads/2009/11/embeber_caracteres.mxp" target="_blank"><strong>Instalador</strong></a> de<strong> Comando</strong> Embeber caracteres.</li>
</ul>
<h1>NOTAS</h1>
<p>Para utilizar el comando debes seleccionar un campo de texto. Para cualquier cosa, dudas, comentarios o sugerencias aquí estaré.</p>
<p>Saludos!!!</p>
<h3>Entradas relacionadas</h3>
<ul>
<li><a title="Recursos JSFL en nomeva.com" href="../category/2008/08/24/recursos-jsfl/" target="_blank">Recursos JSFL</a></li>
<li><a title="Tutorial JSFL - Introducción a comandos" href="../category/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">Tutorial JSFL – Introducción a comandos</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica" href="../category/2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/" target="_blank">Tutorial JSFL – Comandos con interfaz gráfica</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica II" href="../category/2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/" target="_blank">Tutorial JSFL – Comandos con interfaz gráfica II</a></li>
<li><a title="Tutorial JSFL - Introducción a Paneles" href="../category/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank">Tutorial JSFL – Introducción a Paneles</a></li>
<li><a title="Tutorial JSFL - Panel Auto Save" href="../category/2009/06/28/tutorial-jsfl-panel-auto-save/" target="_blank">Tutorial JSFL – Panel Auto Save</a></li>
<li><a title="Tutorial JSFL - Guardar copia FLA 1/2 (comando)" href="../category/2009/07/05/tutorial-jsfl-guardar-copia-fla-12-comando/" target="_blank">Tutorial JSFL – Guardar copia FLA 1/2 (comando)</a></li>
<li><a title="Tutorial JSFL - Introducción a herramientas (tools)" href="../2009/07/17/tutorial-jsfl-introduccion-herramientas-tools/" target="_blank">Tutorial JSFL – Introducción a herramientas (tools)</a></li>
<li><a title="Tutorial JSFL - Localización de contenidos (comando)" href="http://www.nomeva.com/2009/11/11/tutorial-jsfl-localizacion-de-contenidos-comando/" target="_blank">Tutorial JSFL &#8211; Localización de contenidos (comando)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2009/11/13/tutorial-jsfl-embeber-fuentes-y-panel-historial/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL &#8211; Localización de contenidos (Comando)</title>
		<link>http://www.nomeva.com/2009/11/11/tutorial-jsfl-localizacion-de-contenidos-comando/</link>
		<comments>http://www.nomeva.com/2009/11/11/tutorial-jsfl-localizacion-de-contenidos-comando/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 08:47:47 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[comando]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[element]]></category>
		<category><![CDATA[frame]]></category>
		<category><![CDATA[layer]]></category>
		<category><![CDATA[localización]]></category>
		<category><![CDATA[timeline]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=447</guid>
		<description><![CDATA[La localización (traducción) de contenidos es un tema muy importante, en ocasiones es el punto clave de los desarrollos, pero en muchas ocasiones no se tiene en cuenta. En mi caso he tenido que pasar por esta situación más de una vez. Cuando se nos platea la situación siempre pensamos en una configuración inteligente de [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">La localización (traducción) de contenidos es un tema muy importante, en ocasiones es el punto clave de los desarrollos, pero en muchas ocasiones no se tiene en cuenta. En mi caso he tenido que pasar por esta situación más de una vez.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Cuando se nos platea la situación siempre pensamos en una configuración inteligente de los contenidos basada en XML, crear un gestor, objetos, eventos, listeners, switch on the fly para cambiar de idioma y muchas ideas súper guays, pero como siempre tenemos al señor tiempo que viene a presionar, por otro lado el cliente ya tiene el curso completo y funcional, lo único que quiere ahora es que su producto esté en X o Y idioma, vamos que eso tiene que estar chupado.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Pero que pasa cuando quien ha desarrollado esos contenidos no pensó en que algún día se localizarían y utilizó mogollón de campos de texto estáticos, por no hablar de imágenes o diseños, pero esa es otra historia.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Bueno, ahora que más o menos he contado un poco el panorama, jejeje vamos a ver para que sirve todo eso, resumiendo, tenemos, por que si, un fla de su padre y de su madre con un montón de campos de texto estáticos distribuidos por símbolos, gráficos, botones, clips de película y en distintos fotogramas de sus líneas de tiempo respectivas, es decir, un verdadero caos del bueno.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Claro, también tenemos un cliente que nos pide para mañana la traducción de ese curso a Chino, Alemán e Italiano.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">¿Qué hacemos?</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Le decimos al cliente que estamos hasta arriba de trabajo y que no podremos dar prioridad a su trabajo, vamos que no lo vamos a hacer.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Le decimos al cliente que no podemos hacerlo en ese tiempo y que necesitaremos dos semanas por lo menos y que el trabajo será muy costoso.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Le decimos que vale.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Pero que!!!!, ¿cómo que vale? pero este tío está loco, pero si esa tarea es imposible.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Bueno, ahora es donde entra en juego nuestro querido y siempre infravalorado JSFL.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">IDEA E HISTORIETA</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Tenemos una línea de tiempo y muchos elementos en una biblioteca, pues simplemente tenemos que recorrer todas las líneas de tiempo y encontrar todos los campos de texto estáticos, convertirlos en campos de texto dinámicos, asignarles una variable, leer su contenido y guardarlo en un fichero XML.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Como trabajamos en una súper empresa enorme con múltiples departamentos, contamos con un departamento de traducción y muchos más, nos ponemos en contacto con nuestro amigo Axel del departamento de traducción y le pedimos que nos traduzca el fichero XML a los idiomas que ha pedido el cliente, en unas horas nos lo devuelve. ¡Qué gusto trabajar en esta empresa! todos son tan eficientes que dan ganas de dar el 200% de cada uno.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">Bueno, ahora ya tenemos los ficheros XML en Chino, Alemán e Italiano. Pero recordemos, como hemos dicho que trabajamos en una súper empresa en la que todos son la hostia de eficientes, nosotros no vamos a ser menos, así que mientras Axel trabajaba en la traducción del XML, nosotros hemos estado creado el súper lector de XML que simplemente creará variables y asignará valores, para que cuando los textos dinámicos las necesiten ya estén ahí. Así que mira que coincidencia, hemos terminado al mismo tiempo que Axel, con todo el desarrollo que hemos hecho, más esos XML&#8217;s ya tenemos el contenido en 3 idiomas y nos ha tomado menos de un día.</div>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">QUE NECESITAMOS</div>
<h1>INTRODUCCIÓN</h1>
<p>La <strong>localización</strong> (traducción) de contenidos es un tema muy importante, en ocasiones es el punto clave de los desarrollos, pero en muchas ocasiones no se tiene en cuenta. En mi caso he tenido que pasar por esta situación más de una vez.</p>
<p>Cuando se nos platea la situación siempre pensamos en una configuración inteligente de los <strong>contenidos</strong> basada en <strong>XML</strong>, crear un <strong>gestor</strong>, objetos, eventos, listeners,<strong> switch on the fly </strong>para cambiar de idioma y muchas ideas súper guays, pero como siempre tenemos al señor <strong>tiempo</strong> que viene a <strong>presionar</strong>, por otro lado el cliente ya tiene el curso completo y funcional, lo único que quiere ahora es que su producto esté en X o Y idioma, vamos que eso tiene que estar chupado.</p>
<p>Pero que pasa cuando quien ha desarrollado esos contenidos <strong>no pensó</strong> en que algún día se <strong>localizarían</strong> y utilizó mogollón de campos de <strong>texto estáticos</strong>, por no hablar de imágenes o diseños, pero esa es otra historia.</p>
<p><strong>Bueno</strong>, ahora que más o menos he contado un poco el panorama, jejeje vamos a ver para que sirve todo eso, resumiendo, <strong>tenemos</strong>, por que si, <strong>un fla</strong> de su padre y de su madre con un montón de <strong>campos de texto estáticos</strong> distribuidos por símbolos, gráficos, botones, clips de película y en distintos fotogramas de sus líneas de tiempo respectivas, es decir, un verdadero caos del bueno.</p>
<p>Claro, también tenemos un <strong>cliente</strong> que nos pide <strong>para mañana</strong> la <strong>traducción</strong> de ese curso a Chino, Alemán e Italiano.</p>
<h2>¿Qué hacemos?</h2>
<ul>
<li>Le decimos al cliente que estamos hasta arriba de trabajo y que no podremos dar prioridad a su trabajo, vamos que no lo vamos a hacer.</li>
<li>Le decimos al cliente que no podemos hacerlo en ese tiempo y que necesitaremos dos semanas por lo menos y que el trabajo será muy costoso.</li>
<li>Le decimos que vale.</li>
</ul>
<blockquote><p>Pero qué!!!!, ¿cómo que vale? pero este tío está loco, pero si esa tarea es imposible.</p></blockquote>
<p>Bueno, ahora es donde entra en juego nuestro querido y siempre infravalorado <strong>JSFL</strong>.</p>
<h1>IDEA E HISTORIETA</h1>
<p>Tenemos una línea de tiempo y muchos elementos en una biblioteca, pues simplemente tenemos que recorrer todas las líneas de tiempo y encontrar todos los campos de texto estáticos, convertirlos en campos de texto dinámicos, asignarles una variable, leer su contenido y guardarlo en un fichero XML.</p>
<p>Como trabajamos en una súper empresa enorme con múltiples departamentos, contamos con un departamento de traducción y muchos más, nos ponemos en contacto con nuestro amigo Axel del departamento de traducción y le pedimos que nos traduzca el fichero XML a los idiomas que ha pedido el cliente, en unas horas nos lo devuelve. ¡Qué gusto trabajar en esta empresa! todos son tan eficientes que dan ganas de dar el 200% de cada uno.</p>
<p>Bueno, ahora ya tenemos los ficheros XML en Chino, Alemán e Italiano. Pero recordemos, como hemos dicho que trabajamos en una súper empresa en la que todos son la ostia de eficientes, nosotros no vamos a ser menos, así que mientras Axel trabajaba en la traducción del XML, nosotros hemos estado creado el súper lector de XML que simplemente creará variables y asignará valores, para que cuando los textos dinámicos las necesiten ya estén ahí. Así que mira que coincidencia, hemos terminado al mismo tiempo que Axel, con todo el desarrollo que hemos hecho, más esos XML&#8217;s ya tenemos el contenido en 3 idiomas y nos ha tomado menos de un día.</p>
<h1>QUE NECESITAMOS</h1>
<p>Primero un repaso rápido al <strong>entorno de Flash</strong>, en la imagen que se muestra  a continuación podemos ver listados los elementos con los que trabajamos a diario y que para este <strong>Comando</strong> vamos a necesitar.</p>
<p><a href="http://www.nomeva.com/wp-content/uploads/2009/11/esquema_objetos_jsfl.jpg"><img class="aligncenter size-medium wp-image-450" title="esquema objetos jsfl" src="http://www.nomeva.com/wp-content/uploads/2009/11/esquema_objetos_jsfl-300x187.jpg" alt="esquema objetos jsfl" width="300" height="187" /></a></p>
<ol>
<li><strong>Documento</strong> <em>fl.getDocumentDOM()</em></li>
<li><strong>Línea de tiempo</strong><em> fl.getTimeline()</em></li>
<li><strong>Capas</strong><em> fl.getTimeline().layers</em></li>
<li><strong>Biblioteca</strong><em> fl.getDocumentDOM().library</em></li>
<li><strong>Panel de Propiedades</strong><em> fl.setProperty(&#8220;property&#8221;, &#8220;value&#8221;);</em></li>
</ol>
<p>Y ahora si, manos a la obra maestro.</p>
<p>Primero que nada vamos a recorrer la línea de tiempo principal para buscar campos de texto, eso ya nos da pistas sobre lo que tenemos que hacer, veamos, hemos dicho que vamos a recorrer la línea de tiempo principal, entonces esto nos indica que necesitaremos una <strong>referencia </strong>al<strong> documento</strong>, esto lo resolvemos fácilmente utilizando el comando:</p>
<pre class="brush:js">var oDoc = fl.getDocumentDOM();</pre>
<p>Una vez que tenemos una referencia al documento ahora si ya podemos obtener una <strong>referencia</strong> a la<strong> línea de tiempo</strong>, esto lo hacemos con el siguiente dódigo:</p>
<pre class="brush:js">var oTimeline = oDoc.getTimeline();</pre>
<p>Una vez que tenemos una referencia a la línea de tiempo ahora tenemos que obtener una <strong>referencia</strong> a las <strong>capas (layers)</strong>, esta nos la proporciona el objeto línea de tiempo, lo que nos <strong>devuelve</strong> es un <strong>Array </strong>(que guay!!!, de verdad que es súper cómodo trabajar con los Arrays), así que aquí empezaremos a ejecutar bucles <strong>for anidados</strong>. Utilizando un código similar a este:</p>
<pre class="brush:js">var aLayers = oTimeline.layers;
var nTotalLayers = aLayers.length;
for(var i = 0; i &lt; nTotalLayers; i++) { ... }</pre>
<p>Ahora que recorremos las capas, &#8230;</p>
<blockquote><p>¿Porqué recorremos las capas?</p>
<p>Muy buena pregunta, un punto para el que hizo esa pregunta. La respuesta es sencilla, recorremos las capas por que para buscar los campos de texto tenemos que buscar en los fotogramas clave y la única forma que tenemos de garantizar una búsqueda completa es recorriendo todos los fotogramas de la línea de tiempo.</p>
<p>Pero qué!!!!</p>
<p>A ver, a ver, lo vas a hacer tú? o tú? o yo, no, lo va a hacer automáticamente Flash por nosotros, así que hay de que preocuparse.</p></blockquote>
<p>&#8230; vamos a utilizar la propiedad <strong>frames</strong> (<strong>fotogramas</strong>) del objeto <strong>Layer</strong> (<strong>capa</strong>) que también nos devuelve un Array (ahora si que ya no quepo de gozo), para buscar los elementos que tiene ese fotograma, tendríamos un código similar a este:</p>
<pre class="brush:js">var oLayer = aLayers[i];
var aFrames = oLayer.frames;
var nTotalFrames = aFrames.length;
for(var j = 0; j &lt; nTotalLayers; j++) { ... }</pre>
<p>Con esto llegamos casi al punto que nos interesa, el campo de texto, pero nos falta un pequeño paso, el objeto <strong>frame</strong> tiene una propiedad muy útil, me refiero a la propiedad <strong>elements</strong>, esta propiedad curiosamente también nos devuelve un Array (he dicho que me gustan mucho los Arrays, es que son la mar de útiles), el código que utilizaríamos sería algo como lo siguiente:</p>
<pre class="brush:js">var oFrame = aFrames[j];
var aElements = oFrame.elements;
var nTotalElements = aElements.length;
for(var k = 0; k &lt; nTotalLayers; k++) { ... }</pre>
<p>Ahora si, hemos llegado, después de tres bucles anidados, ya tenemos acceso a los elementos del fotograma, así que simplemente tenemos que preguntar el tipo de elemento y en caso de ser de tipo texto podemos modificar sus propiedades y leer el texto que tiene, el código sería más o menos parecido al siguiente:</p>
<pre class="brush:js">var oElement = aElements[k];
if (oElement.elementType == "text") { ... }</pre>
<p>Bueno, que en el párrafo de arriba escribí de más, así que ahora tengo que volver a escribir otra vez lo de modificar las propiedades del campo de texto y leer su texto, esto lo haremos con el siguiente código:</p>
<pre class="brush:js">oElement.textType = "type";
oElement.variableName = "variable_name";
oElement.getTextString();</pre>
<p>Y listo, ya lo tenemos.</p>
<blockquote><p>Menos mal, ya me estaba cansando.</p>
<p>Hey!!! que puedo leer vuestras mentes, a ver tú y tú, los puntos que os habéis ganado hace rato ahora los habéis perdido.</p>
<p>No, no estoy de acuerdo. Si, me estoy cansando, ¿y qué? es normal, con estos tutoriales tan grandes como quieres conservar la atención tanto tiempo. Si quieres mi atención deberías hacer algo más interactivo, entretenido, divertido, cómico, algo en lo podamos participar y no quedarnos todo el rato leyendo. Pero &#8230;</p>
<p>Vale, vale, lo siento. Es que estoy aprendiendo. Pero tomo nota de tus comentario, es más, por ser tan honesto te has ganado 150 puntos. Veis chicos, si todos participaseis cuando menos un poco así &#8230;</p></blockquote>
<p>Ahora veamos el código completo:</p>
<pre class="brush:js">//Delcaración de variables
var oDoc;
var oLib;
var SEPARATOR = ";";
var PREFFIX_VAR_NAME = "_root.varCommandTextLocalizable_";
var nCounter;

var sXML;

//Llamada a los métodos de configuración e inicialización del comando
this.config();
this.init();

/**
 * @method		config
 * @description	Método encargado de configurar el comando
 * @return		Void
 */
function config()
{
	//Indicamos que no queremos ver el mensaje sobre un script de ejecución demasiado larga
	fl.showIdleMessage(false);

	//Limpiamos la ventana de salida
	fl.outputPanel.clear();

	if(fl.getDocumentDOM())
	{
		//Obtenemos la referencia al documento y a la biblioteca
		this.oDoc = fl.getDocumentDOM();
		this.oLib = this.oDoc.library;
	}
	else
	{
		//En caso que no haya un documento abierto mostrarmo un mensaje de alerta.
		alert("Debes tener un documento abierto.");
	}
}

/**
 * @method		init
 * @description	Método encargado de inicializar el comando
 * @return		Void
 */
function init()
{
	//Delcaración de variables
	var aItems = this.oLib.items;
	var nTotalItems = aItems.length;
	var oItem;
	this.nCounter = 1;

	//Inicializamos el valor del XML abriendo la etiqueta principal
	this.sXML  = "&lt;DATA&gt;\n";

	//Llamamos al método analizeTimeline para que analice le línea de tiempo principal
	this.analizeTimeline();

	for (var i = 0; i &lt; nTotalItems; i++)
	{
		oItem = aItems[i];
		if ((oItem.itemType == "movie clip") || ( oItem.itemType == "graphic") || (oItem.itemType == "button") )
		{
			this.oLib.editItem(oItem.name);
			this.analizeTimeline();
		}
	}

	//Finalizamos el valor del XML cerrando la etiqueta principal
	this.sXML += "&lt;/DATA&gt;";

	//Llamada al método createXmlFile
	this.createXmlFile();

	//Limpiamos la memoria de Flash eliminando las variable que hemos creado
	delete aItems, nTotalItems, oItem;
}

/**
 * @method		analizeTimeline
 * @description	Método encargado analizar una línea de tiempo para buscar campos de texto
 *				si encuentra campos de texto, los convierte en dinámicos y les añade
 *				una variable.
 *				Toda la información que va encontrando la almacena en la variable sXML
 * @return		Void
 */
function analizeTimeline()
{
	//Delcaración de variables
	var oTimeline = this.oDoc.getTimeline();
	var aLayers = oTimeline.layers;
	var nTotalLayers = aLayers.length;
	var oLayer;

	//Recorremos las capas
	for (var j = 0; j &lt; nTotalLayers; j++)
	{
		oLayer = aLayers[j];
		oLayer.locked = false;
		oLayer.visible = true;
		if ((oLayer.layerType != "guide") || (oLayer.layerType != "folder"))
		{
			//Delcaración de variables
			var aFrames = oLayer.frames;
			var nTotalFrames = aFrames.length;
			var oFrame;
			var aElements;

			//Recorremos los fotogramas de la capa
			for (var k = 0; k &lt; nTotalFrames; k++)
			{
				oFrame = aFrames[k];
				if (oFrame.elements.length &gt; 0)
				{
					aElements = oFrame.elements;

					//Delcaración de variables
					var nTotalElements = aElements.length;
					var oElement;

					//Recorremos los elementos del fotograma
					for (var l = 0; l &lt; nTotalElements; l++)
					{
						oElement = aElements[l];
						if (oElement.elementType == "text" &amp;&amp; oElement.textType != "input")
						{
							//Delcaración de variables
							var sDataItem = "Nombre de la timeline: " + oTimeline.name;
							var sDataLayer = "Nombre de la capa: " + oLayer.name;
							var sDataFrame = "Número de fotograma: " + (k + 1);
							var sDataElement = "Nombre del elemento: " + oElement.name;
							var sElementText = "Texto del elemento: " + oElement.getTextString();
							var sElementFormat = "Formato del elemento: " + "";
							//fl.trace(sDataItem + this.SEPARATOR + sDataLayer + this.SEPARATOR + sDataFrame + this.SEPARATOR + sDataElement + this.SEPARATOR + sElementText);

							oElement.textType = "dynamic";
							oElement.variableName = this.PREFFIX_VAR_NAME + this.nCounter;

							this.sXML += "	&lt;node varName=\"" + this.PREFFIX_VAR_NAME + this.nCounter + "\"&gt;\n";
							this.sXML += "		&lt;![CDATA[" + oElement.getTextString() + "]]&gt;\n";
							this.sXML += "	&lt;/node&gt;\n";

							this.nCounter++;
						}
					}

					//Limpiamos la memoria de Flash eliminando las variable que hemos creado
					delete nTotalElements, oElement;

				}

				//Incrementamos el valor de k con la duración del fotograma, esto es para que en el siguiente
				//ciclo del bucle vayamos director al siguiente fotograma clave
				k += oFrame.duration - 1;
			}

			//Limpiamos la memoria de Flash eliminando las variable que hemos creado
			delete aFrames, nTotalFrames, oFrame, aElements;
		}

		this.oDoc.exitEditMode();
	}

	//Limpiamos la memoria de Flash eliminando las variable que hemos creado
	delete oTimeline, aLayers, nTotalLayers, oLayer;
}

/**
 * @method		createXmlFile
 * @description	Método encargado de crear el fichero XML con la relación entre textos y variables
 * @return		Void
 */
function createXmlFile()
{
	//Declaración de variables
	var sPath = this.oDoc.pathURI.split(this.oDoc.name).shift();
	var sFileURI = sPath + "textos_extraidos_automaticamente.xml";

	//Comprobación, si existe el fichero lo eliminamos
	if (FLfile.exists(sFileURI))
		FLfile.remove(sFileURI);

	//Creamos el fichero XML
	FLfile.write(sFileURI, this.sXML);

	//Limpiamos la memoria de Flash eliminando las variable que hemos creado
	delete sPath, sFileURI;
}</pre>
<p>Bueno, en este código encontramos además de lo explicado en este tutorial para <strong>recorrer las líneas de tiempo</strong>, <strong>modificar propiedades de campos de texto</strong> y <strong>extraer textos</strong>, código para crear ficheros de texto, en el caso del ejemplo crear un fichero XML con la relación entre la variable asignada al campo de texto y el texto.</p>
<p>El código está comentado, pero si hace falta alguna explicación, si tenéis alguna duda, comentario, mejora, sugerencia, pues aquí estaré gustoso de seguir compartiendo.</p>
<h1>DESCARGAS</h1>
<p>Como es habitual dejo descargas del fichero <strong>JSFL</strong>, también el fichero <strong>MXP</strong> instalable y un <strong>zip</strong> con el paquete del JSFL y un FLA de ejemplo para extraer los textos.</p>
<ul>
<li><a title="Comando - Extractor de Textos" href="http://www.nomeva.com/wp-content/uploads/2009/11/extractor_de_textos.jsfl" target="_blank"><strong>Comando</strong></a> Extractor de Textos (versión JSFL).</li>
<li><a title="Instalador MXP - Extractor de Textos" href="http://www.nomeva.com/wp-content/uploads/2009/11/extractor_de_textos.mxp" target="_blank"><strong>Instalador</strong></a> de<strong> Comando</strong> Extractor de Textos.</li>
<li><a title="Paquete - Extractor de Textos" href="http://www.nomeva.com/wp-content/uploads/2009/11/extractor_textos_paquete.zip" target="_blank"><strong>Paquete</strong></a> con <strong>JSFL</strong> y <strong>FLA</strong> de ejemplo.</li>
</ul>
<p>Saludos!!!</p>
<h1>NOTAS</h1>
<p>Se que algunas personas tendrán mucho que decir, así que por favor háganlo, el tema es complicado, la localización de contenidos es algo muy chungo en ocasiones tal como lo plateo en este ejemplo.</p>
<p>También es cierto que con este ejemplo <strong>no salvamos </strong>otros obstáculos tales como <strong>imágenes que tienen textos </strong>y que con la solución de modificar los campos de texto podríamos estropear el funcionamiento de algunos <strong>campos de texto que ya fuesen dinámicos </strong>y que utilizaran variables.</p>
<p>Ahora si, después de estas notas y una última aclaración, <strong>mi objetivo</strong> es <strong>explicar</strong> el funcionamiento de los <strong>objetos </strong>de<strong> JSFL</strong>, el ejemplo se presta para sacarle partido al lenguaje, así que por eso lo he desarrollado.</p>
<h3>Entradas relacionadas</h3>
<ul>
<li><a title="Recursos JSFL en nomeva.com" href="../category/2008/08/24/recursos-jsfl/" target="_blank">Recursos JSFL</a></li>
<li><a title="Tutorial JSFL - Introducción a comandos" href="../category/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">Tutorial JSFL – Introducción a comandos</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica" href="../category/2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/" target="_blank">Tutorial JSFL – Comandos con interfaz gráfica</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica II" href="../category/2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/" target="_blank">Tutorial JSFL – Comandos con interfaz gráfica II</a></li>
<li><a title="Tutorial JSFL - Introducción a Paneles" href="../category/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank">Tutorial JSFL – Introducción a Paneles</a></li>
<li><a title="Tutorial JSFL - Panel Auto Save" href="../category/2009/06/28/tutorial-jsfl-panel-auto-save/" target="_blank">Tutorial JSFL – Panel Auto Save</a></li>
<li><a title="Tutorial JSFL - Guardar copia FLA 1/2 (comando)" href="../category/2009/07/05/tutorial-jsfl-guardar-copia-fla-12-comando/" target="_blank">Tutorial JSFL – Guardar copia FLA 1/2 (comando)</a></li>
<li><a title="Tutorial JSFL - Introducción a herramientas (tools)" href="../2009/07/17/tutorial-jsfl-introduccion-herramientas-tools/" target="_blank">Tutorial JSFL – Introducción a herramientas (tools)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2009/11/11/tutorial-jsfl-localizacion-de-contenidos-comando/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL &#8211; Crear documentos FLA dinámicamente</title>
		<link>http://www.nomeva.com/2009/08/28/tutorial-jsfl-crear-documentos-fla-dinamicamente/</link>
		<comments>http://www.nomeva.com/2009/08/28/tutorial-jsfl-crear-documentos-fla-dinamicamente/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 07:49:10 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[command line]]></category>
		<category><![CDATA[fla dinamicamente]]></category>
		<category><![CDATA[linea de comandos]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=399</guid>
		<description><![CDATA[Por fin ya de vuelta de las vacaciones y retomando nuevamente el mando de mi vida estoy aquí para compartir otro tutorial sobre JSFL, para ser exactos no es ni un Comando ni un Panel ya que la ejecución de este JSFL se hace automáticamente desde la línea de comandos mediante una llamada desde una [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center; "><img class="aligncenter size-full wp-image-400" title="fla on the fly" src="http://www.nomeva.com/wp-content/uploads/2009/08/fla_on_the_fly.jpg" alt="fla on the fly" width="320" height="200" /></p>
<p style="text-align: left;">Por fin ya de vuelta de las vacaciones y retomando nuevamente el mando de mi vida estoy aquí para compartir otro <a title="Tutoriales en nomeva.com" href="http://www.nomeva.com/category/tutoriales/" target="_blank"><strong>tutorial</strong></a> sobre <a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank"><strong>JSFL</strong></a>, para ser exactos no es ni un <a title="Tutorial JSFL - Introducción a comandos" href="http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank"><strong>Comando</strong></a> ni un <a title="Tutorial JSFL - Introduccióna Paneles" href="http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank"><strong>Panel</strong></a> ya que la ejecución de este JSFL se hace automáticamente desde la línea de comandos mediante una llamada desde una aplicación AIR o simplemente haciendo doble clic.</p>
<h1>HISTORIA</h1>
<p>El otro día hablando con <strong><a title="Iván Gajate" href="http://www.yporqueno.es/blog/" target="_blank">Iván Gajate</a></strong> me preguntaba sobre la forma de <strong>crear FLA&#8217;s dinámicamente</strong> y automáticamente me vino a la cabeza <strong>JSFL </strong>aunque no es la súper solución porque lo que realmente queríamos conseguir es utilizar una <strong>librería en C</strong> para generar FLA&#8217;s con ciertas características peculiares como el tamaño, el color y los fotogramas por segundo, pero como ninguno de los dos es un experto programador en C pues optamos por el camino de <strong>JSFL </strong>que me gusta y controlo más.</p>
<h1>LA IDEA</h1>
<p>Desde la aplicación AIR se generará un fichero de texto que nos servirá para configurar las características del FLA que se va a crear y luego simplemente ejecutamos el JSFL. Ya está, así de simple.</p>
<h2>COSAS A DESTACAR (o que vamos a aprender)</h2>
<p>Con este tutorial aprenderemos:</p>
<ul>
<li>Otra forma de <strong><a title="Ejecución de scripts JSFL" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7fe8.html" target="_blank">ejecutar</a></strong> los ficheros JSFL.</li>
<li>El uso del objeto <a title="Objeto FLfile" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7fa1.html" target="_blank"><strong>FLfile</strong></a>, exactamente del método <a title="Método read del objeto FLfile" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7adf.html" target="_blank"><strong>read</strong></a>.</li>
<li>Que podemos hacer más cosas de las que parece a simple vista, por ejemplo a cerrar la propia aplicación.</li>
</ul>
<h1>MANOS A LA OBRA</h1>
<h2>Parte 1: JSFL desde la línea de comandos</h2>
<p>Hasta ahora hemos visto tres formas de utilizar JSFL, a través de <a title="Tutorial JSFL - Introducción a comandos" href="http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank"><strong>Comando</strong></a>, a través de <a title="Tutorial JSFL - Introduccióna Paneles" href="http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank"><strong>Panel</strong></a> y a través de <a title="Tutorial JSFL - Introducción a herramientas (tools)" href="http://www.nomeva.com/2009/07/17/tutorial-jsfl-introduccion-herramientas-tools/" target="_blank"><strong>Herramientas</strong></a>, pero esas no son todas las formas en las que podemos utilizar <strong>JSFL </strong>ya que existe una más que es de la que vamos a echar mano hoy, me refiero a la ejecución de JSFL mediante <strong>línea de comandos</strong>.</p>
<p>Me explico, dentro de nuestro equipo tenemos:</p>
<p><em>lugar_de_instalacion_de_flash\flash.exe</em></p>
<p>y digamos, por ponerle un nombre, que en<strong> C </strong>tenemos una carpeta que se llama <strong>ejemplo </strong>y que dentro de ejemplo tenemos un fichero que se llama <strong>generar_fla_dinamicamente.jsfl</strong>, entonces podríamos decir desde la línea de comandos lo siguiente:</p>
<p><em>&#8220;lugar_de_instalacion_de_flash\<strong>flash.exe</strong>&#8221; &#8220;C:\ejemplo\<strong>generar_fla_dinamicamente.jsfl</strong>&#8220;</em></p>
<p>esto ejecutaría Flash y automáticamente cargaría el JSFL para ejecutarlo, fácil no?, que frikis que sómos, jejeje.</p>
<h2>Parte 2: Leer el fichero de configuración</h2>
<p>Ahora que ya estamos en nuestro ámbito, recordemos que JSFL sólo funciona con Flash abierto y gracias a la ejecución de JSFL mediante línea de comandos hemos conseguido abrir Flash ya podemos continuar con el proceso del JSFL. Como hemos dicho vamos a leer un fichero de texto que la aplicación AIR ha generado, para seguir con la buena costumbre y quizá también por casualidad o no se muy bien porque, la aplicación AIR genera ese fichero en <strong>C </strong>dentro de la carpeta <strong>ejemplo</strong>.</p>
<p>El contenido del fichero es muy simple, se encuentran <strong>emparejados </strong><em>variable </em>y <em>valor </em>separados por <strong>ampersand</strong> (<strong>&amp;</strong>), como se de variables GET se tratara. Por ejemplo:</p>
<p><em>frameRate=50&amp;backgroundColor=#00FFFF&amp;width=800&amp;height=200</em></p>
<p>Esto ahora mismo no viene al caso, pero bueno ya lo escribí así que ahí se quedará y más tarde que lo necesitemos hablaremos de él. Lo que realmente necesitamos es utilizar el objeto <a title="Objeto FLfile" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7fa1.html" target="_blank"><strong>FLfile</strong></a> para que con ayuda del método <a title="Método read del objeto FLfile" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7adf.html" target="_blank"><strong>read</strong></a> leamos el fichero de configuración, de tal forma que nuestro código quedaría así:</p>
<pre lang="javascript">var sConfiguration = FLfile.read("ruta del fichero de configuración");</pre>
<p>Ahora si, dentro de la variable <strong>sConfiguration </strong>tenemos el contenido del fichero de configuración de tal forma que vamos a tratar el contenido para utilizarlo más adelante, para esto vamos a utilizar funciones básicas de <strong>JavaScript</strong>, es decir <strong>splits </strong>y <strong>bucles </strong>para separar y obtener las variables y su valor, al final lo guardaremos en un <em>array asociativo</em> para tener todas las variables en un mismo sitio y listo, esto lo conseguimos con el siguiente código:</p>
<pre lang="javascript">var aConfiguration = new Array();
var aValues = sConfiguration.split("&amp;");
var nTotalValues = aValues.length;
for(var i = 0; i &lt; nTotalValues; i++)
{
	var aTmp = aValues[i].split("=");
	aConfiguration[aTmp[0]] = aTmp[1];
}</pre>
<h2>Parte 3: Crear el nuevo documento, configurarlo y cerrar Flash</h2>
<p>Bueno hasta ahora tenemos acceso al DOM de Flash ya que lo hemos abierto mediante línea de comandos, también tenemos una configuración almacenada en un array asociativo ya sólo nos queda crear el documento y configurarlo, esto lo conseguimos de dos formas, primero lo primero, para crear el documento Fla utilizaremos el método <a title="Método createDocument del objeto fl" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7bab.html" target="_blank"><strong>createDocument </strong></a>del objeto <strong><a title="Objeto fl" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7fa0.html" target="_blank">fl</a></strong>, este método nos devuelve una referencia al documento creado, lo vamos a almacenar en una variable para más adelante modificar sus propiedades, el ejemplo de la creación del documento es el siguiente:</p>
<pre lang="javascript">var oDoc = fl.createDocument();</pre>
<p>Ahora simplemente tenemos que configurar los valores que nos indicaron en el fichero de configuración, que ahora ya los tenemos en un <em>array asociativo</em>, así que con una comprobación y una asignación lo tendremos todo resuelto. En este caso deseamos modificar el <a title="Propiedad backgroundColor del objeto Document" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7e5a.html" target="_blank"><strong>color de fondo</strong></a>, los <a title="Propiedad frameRate del objeto Document" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7e54.html" target="_blank"><strong>fotogramas por segundo</strong></a>, el <a title="Propiedad height del objeto Document" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7e53.html" target="_blank"><strong>alto</strong></a> y el <a title="Propiedad width del objeto Document" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7d3d.html" target="_blank"><strong>ancho</strong></a> del documento, así que pare esto simplemente tendremos que modificar esas propiedades de nuestro objeto <strong><a title="Objeto Document" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7ffa.html" target="_blank">Document</a></strong>. El ejemplo es el siguiente:</p>
<pre lang="javascrip">if(aConfiguration["backgroundColor"])
	oDoc.backgroundColor = aConfiguration["backgroundColor"];

if(aConfiguration["frameRate"])
	oDoc.frameRate = Number(aConfiguration["frameRate"]);

if(aConfiguration["width"])
	oDoc.width = Number(aConfiguration["width"]);

if(aConfiguration["height"])
	oDoc.height = Number(aConfiguration["height"]);</pre>
<p>Y listo, ya hemos configurado el nuevo documento, ahora simplemente nos queda guardar el documento y cerrar Flash. Para guardar el documento utilizaremos el método <a title="Método saveDocument del objeto fl" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7d12.html" target="_blank"><strong>saveDocument</strong></a> del objeto <strong><a title="Objeto fl" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7fa0.html" target="_blank">fl</a></strong>, éste método recibe dos parámetros, en el primero indicamos el documento que deseamos guardar y en el segundo la ruta en la que deseamos guardar el documento, por ejemplo:</p>
<pre lang="javascrip">fl.saveDocument(oDoc, "ruta_donde_queremos_guardar_el_documento\documento_creado_dinamicamente.jsfl")</pre>
<p>Vale pues ahora vamos a una de las cosas que más me gusta y sorprende, quizá sea un tontería pero saber que tenemos ese poder me gusta mucho, jejeje. Vamos a cerrar Flash, ya que una vez que hemos creado el documento, lo hemos configurado y lo hemos guardado, ya no necesitamos tener abierto Flash para nada, así que allá vamos. Esta tarea la conseguimos haciendo uso del método <strong><a title="Método quit del objeto fl" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7b94.html" target="_blank">quit</a></strong> del objeto <strong><a title="Objeto fl" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7fa0.html" target="_blank">fl</a></strong>, éste método recibe un parámetro opcional para preguntar al usuario sobre guardar los cambios, en nuestro caso no lo queremos así que pasaremos false, el ejemplo es el siguiente:</p>
<pre lang="javascrip">fl.quit(false);</pre>
<p>Y listo con esto terminamos este Tutorial que espero os sea de utilidad o que de una vez por todas los haga pensar en utilizar más a menudo JSFL.</p>
<h1>DESCARGAS</h1>
<p>En este caso pongo un <a title="Ejemplo del Tutorial de JSFL sobre creación dinámica de documentos fla" href="http://www.nomeva.com/wp-content/uploads/2009/08/tutorial_jsfl_creacion_dinamica_de_documentos_fla.zip" target="_blank"><strong>zip</strong></a> donde está todo preparado para funcionar en la carpeta ejemplo en el disco duro C, si lo quieres modificar simplemente cambia la ruta en la primera variable del fichero JSFL, la variable <em>sPath</em>.</p>
<p>Saludos, para cualquier cosa, dudas o comentarios aquí estaré.</p>
<h3>Entradas relacionadas</h3>
<ul>
<li><a title="Recursos JSFL en nomeva.com" href="../2008/08/24/recursos-jsfl/" target="_blank">Recursos JSFL</a></li>
<li><a title="Tutorial JSFL - Introducción a comandos" href="../2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">Tutorial JSFL &#8211; Introducción a comandos</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica" href="../2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica II" href="../2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica II</a></li>
<li><a title="Tutorial JSFL - Introducción a Paneles" href="../2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank">Tutorial JSFL &#8211; Introducción a Paneles</a></li>
<li><a title="Tutorial JSFL - Panel Auto Save" href="../2009/06/28/tutorial-jsfl-panel-auto-save/" target="_blank">Tutorial JSFL &#8211; Panel Auto Save</a></li>
<li><a title="Tutorial JSFL - Guardar copia FLA 1/2 (comando)" href="../2009/07/05/tutorial-jsfl-guardar-copia-fla-12-comando/" target="_blank">Tutorial JSFL &#8211; Guardar copia FLA 1/2 (comando)</a></li>
<li><a title="Tutorial JSFL - Introducción a herramientas (tools)" href="http://www.nomeva.com/2009/07/17/tutorial-jsfl-introduccion-herramientas-tools/" target="_blank">Tutorial JSFL &#8211; Introducción a herramientas (tools)<strong><br />
</strong></a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2009/08/28/tutorial-jsfl-crear-documentos-fla-dinamicamente/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL &#8211; Introducción a herramientas (tools)</title>
		<link>http://www.nomeva.com/2009/07/17/tutorial-jsfl-introduccion-herramientas-tools/</link>
		<comments>http://www.nomeva.com/2009/07/17/tutorial-jsfl-introduccion-herramientas-tools/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 15:09:38 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[herramienta]]></category>
		<category><![CDATA[mxp]]></category>
		<category><![CDATA[tablas]]></category>
		<category><![CDATA[tables]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=389</guid>
		<description><![CDATA[Este es un post que tenía pendiente desde hace tiempo, en esta ocasión voy a hablar sobre las herramientas (tools) de Flash y de como personalizarlas o como es nuestro caso crear una nueva herramienta con JSFL. INTRODUCCIÓN Recuerdo en los tiempos de Flash 4 que fué cuando empecé con Flash que por comodidad y [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-390" title="lego briks" src="http://www.nomeva.com/wp-content/uploads/2009/07/lego_briks.jpg" alt="lego briks" width="290" height="190" /></p>
<p>Este es un post que tenía pendiente desde hace tiempo, en esta ocasión voy a hablar sobre las <strong>herramientas</strong> (tools) de <strong>Flash</strong> y de como personalizarlas o como es nuestro caso crear una nueva herramienta con <strong>JSFL</strong>.</p>
<h1>INTRODUCCIÓN</h1>
<p>Recuerdo en los tiempos de <strong>Flash 4</strong> que fué cuando empecé con <strong>Flash</strong> que por comodidad y sobre todo por desconocimiento de la aplicación, quería hacer <strong>tablas</strong> en <strong>Flash</strong> y por mucho que busqué no encontré una herramienta que me sirviera para esto, así que al final aprendí a utilizar las <strong>herramientas de dibujo</strong> y a través de cuadros y líneas con las herramientas <strong>rectángulo</strong> y <strong>trazo</strong> conseguí hacer las tablas que quería, luego con el tiempo descubrí el panel alineación y distribución y con eso perfeccioné la tarea y me fué más fácil hacer estas tablas.</p>
<p>Bueno, pues la idea es que vamos a crear una herramienta para crear tablas de una manera fácil como si de rectángulos se tratara.</p>
<h1>DESARROLLO</h1>
<p><strong>JSFL</strong> nos permite extender la funcionalidad de la aplicación, como <a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank"><strong>hemos hablado</strong></a> ya en otras ocasiones, lo podemos hacer <strong>con </strong><a title="Tutorial JSFL - Introducción a comandos" href="http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank"><strong>comandos</strong></a> y <a title="Tutorial JSFL - Introducción a paneles" href="http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank"><strong>paneles</strong></a>, pero también existe otro modo de extender y automatizar procesos, me refiero a la creación de herramientas.</p>
<p>Las herramientas al igual que los comandos y paneles se programan con <strong><a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank">JSFL</a> </strong>y se almacenan en las siguiente rutas respectivamente por sistema operativo:</p>
<ul>
<li><strong>Windows Vista</strong></li>
</ul>
<p><em>unidad de arranque</em>\Users\<em>nombre de usuario</em>\Local Settings\Application Data\Adobe\Flash<br />
<strong></strong></p>
<p>CS4\<em>idioma</em>\Configuration\Tools<span> </span></p>
<ul>
<li><strong>Windows XP</strong></li>
</ul>
<p><em>unidad de arranque</em>\Documents and Settings\<em>usuario</em>\Local Settings\Application Data\Adobe\Flash<br />
<strong></strong></p>
<p>CS4\<em>idioma</em>\Configuration\Tools<span> </span></p>
<ul>
<li><strong>Mac OS X</strong></li>
</ul>
<p>Macintosh HD/Usuarios/<em>nombre de usuario</em>/Librería/Application Support/Adobe/Flash</p>
<p><strong></strong></p>
<p>CS4/<em>idioma</em>/Configuration/Tools</p>
<p>A diferencia de los comandos y los paneles en las herramientas tenemos acceso a funciones y métodos de nivel superior que nos ayudan a desarrollar y controlar el estado de nuestra herramienta, las funciones disponibles son las siguiente:</p>
<ul>
<li> activate()</li>
<li> configureTool()</li>
<li> deactivate()</li>
<li> keyDown()</li>
<li> keyUp()</li>
<li> mouseDoubleClick()</li>
<li> mouseDown()</li>
<li> mouseMove()</li>
<li> mouseUp()</li>
<li> notifySettingsChanged()</li>
<li> setCursor()<span> </span></li>
</ul>
<p>Las que utilizaremos para la creación de la herramienta <strong>tablas</strong> serán, <strong><a title="Función activate" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7765.html" target="_blank">activate</a></strong> que se dispara cuando la herramienta es seleccionada por el usuario, <strong><a title="Función deactivate" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7760.html" target="_blank">deactivate</a></strong> que se dispara cuando el usuario cambia a otra herramienta, <strong><a title="Función notifySettingsChanged" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7758.html" target="_blank">notifySettingsChanged</a></strong> que se dispara cuando el usuario modifica las propiedades de nuestra herramienta, <strong><a title="Función mouseDown" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-775b.html" target="_blank">mouseDown</a></strong>, <strong><a title="Función mouseMove" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-775a.html" target="_blank">mouseMove </a></strong>y <strong><a title="Función mouseUp" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7759.html" target="_blank">mouseUp</a></strong> que se disparan cuando el usuario hace lo que el nombre de la función dice <img src='http://www.nomeva.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Esto con respecto a los <strong>eventos</strong> para controlar nuestra herramienta.</p>
<h3>Pero ¿cómo accedemos a la herramienta?</h3>
<p>Pues fácil, como todo en JSFL son objetos necesitamos obtener la referencia a la herramienta activa que será nuestra herramienta, esto lo hacemos con la propiedad <strong><a title="Propiedad activeTool" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7f18.html" target="_blank">activeTool</a></strong> del objeto <strong><a title="Objeto Tools" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7fec.html" target="_blank">tools</a></strong>, en el ejemplo siguiente se muestra como obtener una referencia a la herramienta.</p>
<pre lang="javascript">theTool = fl.tools.activeTool;</pre>
<h3>Guay, ¿Y para qué quiero tener una referencia al objeto herramienta?</h3>
<p>Pues para asignar a nuestra herramienta nombre, tooltip, icono, opciones, especificar el tipo para el inspector de propiedades por ejemplo y muchas más cosas. Como se muestra a continuación.</p>
<pre lang="javascript">// Set the standard tool information
theTool = fl.tools.activeTool;
theTool.setToolName("Tablas");
theTool.setIcon("Tablas.png");
theTool.setMenuString("Herramienta Tablas");
theTool.setToolTip("Herramienta Tablas");
theTool.setOptionsFile("Tablas.xml");

// This tool uses the Shape property inspector
theTool.setPI( "shape" );</pre>
<h3>Vale, vale, ya me entero, pero ¿Cómo dibujo?</h3>
<p>Ah, muy cierto, pues para pintar / dibujar debemos hacer una nota importante y es que tenemos dos momento de dibujo:</p>
<ul>
<li>El momento de la previsualización</li>
<li>El momento del dibujo final</li>
</ul>
<p>Para el momento de la pre-visualización utilizaremos el objeto <a title="Objeto drawingLayer" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7ff6.html" target="_blank"><strong>drawingLayer</strong></a> y sus métodos <strong><a title="Método moveTo del objeto drawingLayer" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7c61.html" target="_blank">moveTo</a></strong> y <strong><a title="Método lineTo del objeto drawingFrame" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7c62.html" target="_blank">lineTo</a></strong> que son idénticos a los que utilizamos en la API de dibujo de ActionScript y los método <strong><a title="Método beginFrame del objeto drawingLayer" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7c62.html" target="_blank">beginFrame</a></strong> y <strong><a title="Método endFrame del objeto drawingLayer" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7c64.html" target="_blank">endFrame</a> </strong>para indicar el incio y el fin del dibujo de la pre-visualización. Por ejemplo, con el siguiente código dibujaríamos un cuadro de 20&#215;20 en 0, 0:</p>
<pre lang="javascript">fl.drawingLayer.beginFrame();
fl.drawingLayer.moveTo(0, 0);
fl.drawingLayer.lineTo(20, 0);
fl.drawingLayer.lineTo(20, 20);
fl.drawingLayer.lineTo(0, 20);
fl.drawingLayer.lineTo(0, 0);
fl.drawingLayer.endFrame();</pre>
<p>Y para el momento del dibujo final utilizaremos también el objeto <a title="Objeto drawingLayer" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7ff6.html" target="_blank"><strong>drawingLayer</strong></a> para crear un objeto <strong><a title="Objeto Path" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7f3e.html" target="_blank">path</a></strong> con el método <strong><a title="Método newPath del objeto drawingLayer" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7c5d.html" target="_blank">newPath</a>,</strong> luego utilizaremos los métodos <strong><a title="Método addPoint del objeto Path." href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-79d9.html" target="_blank">addPoint</a></strong> y <strong><a title="Método makeShape del objeto Path." href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-79d6.html" target="_blank">makeShape</a></strong> para crear nuestro dibujo. Por ejemplo:</p>
<pre lang="javascript">var myPath = fl.drawingLayer.newPath();
myPath.addPoint(0, 20);
myPath.addPoint(20, 20);
myPath.addPoint(20, 0);
myPath.addPoint(0, 0);
myPath.makeShape(false, true);</pre>
<h3>Perfecto, y ahora ¿cómo modifico las propiedades de mi herramienta?</h3>
<p>Vale, para esto debemos recordar que en un principio utilizamos el método <a title="Método setOptionsFile del objeto Tool." href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-77f2.html" target="_blank"><strong>setOptionsFile</strong></a> del objeto <strong><a title="Objeto Tool." href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7f33.html" target="_blank">tool</a></strong> donde indicamos un fichero xml, este fichero xml contiene la definición de las propiedades que utilizaremos en la herramienta. Por ejemplo para la herramienta tabla, utilizo dos propiedades <strong>nColumns</strong> y <strong>nRows</strong>. Un ejemplo del fichero xml de configuración es el siguiente:</p>
<pre lang="xml">property name="Columnas: " variable="nColumns" min="1" max="100" defaultValue="3" type="Number"
property name="Filas: " variable="nRows" min="1" max="100" defaultValue="3" type="Number"</pre>
<p>Cuando el usuario modifique estos valores en el panel de propiedades se nos notificará en el evento (la función) <strong><a title="Función notifySettingsChanged" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7758.html" target="_blank">notifySettingsChanged</a><span style="font-weight: normal;">. Un ejemplo de como utilizar los valores modificados es el siguiente:</span></strong></p>
<pre lang="javascript">function notifySettingsChanged()
{
	var theTool = fl.tools.activeTool;

	this.nColumns = theTool.nColumns;
	this.nRows = theTool.nRows;
}</pre>
<p><strong><span style="font-weight: normal;">Y listo, con esto ya tenemos controladas todas las fases del diseño de una herramienta.</span></strong></p>
<h1>EJEMPLOS</h1>
<p>A continuación un par de ejemplos de lo que podemos conseguir de una manera sencilla con esta herramienta.</p>
<p style="text-align: center;"><a href="http://www.nomeva.com/wp-content/uploads/2009/07/imagen-2.png"><img class="aligncenter size-thumbnail wp-image-392" title="Ejemplo 1 Herramienta Tablas" src="http://www.nomeva.com/wp-content/uploads/2009/07/imagen-2-300x187.png" alt="Ejemplo 1 Herramienta Tablas" width="300" height="187" /></a></p>
<p><a href="http://www.nomeva.com/wp-content/uploads/2009/07/imagen-2.png"></a><a href="http://www.nomeva.com/wp-content/uploads/2009/07/imagen-3.png"><img class="aligncenter size-medium wp-image-393" title="Ejemplo 2 Herramienta Tablas" src="http://www.nomeva.com/wp-content/uploads/2009/07/imagen-3-300x187.png" alt="Ejemplo 2 Herramienta Tablas" width="300" height="187" /></a></p>
<p><img class="aligncenter size-full wp-image-395" title="herramienta tablas" src="http://www.nomeva.com/wp-content/uploads/2009/07/herramienta_tablas.png" alt="herramienta tablas" width="313" height="412" /></p>
<h1>DESCARGAS</h1>
<p>Tenemos dos tipos de descargas, para instalar simplemente la <strong>herramienta</strong> <strong>Tablas</strong> y para descargar el JSFL:</p>
<ul>
<li><a title="Extensión Herramienta Tablas" onclick="javascript:pageTracker._trackPageview('/downloads/tutoriales/jsfl/Escribir_palabra_mxp.zip');" href="http://www.nomeva.com/tutoriales/jsfl/herramienta_tablas.mxp" target="_blank">Extensión</a> <strong>Herramienta Tablas</strong> (instalador mxp).</li>
<li><a title="Herramienta Tablas" href="http://www.nomeva.com/tutoriales/jsfl/herramienta_tablas.zip" target="_blank">Paquete zip</a> con la <strong>Herramienta Tablas</strong> (ficheros jsfl, xml y png).</li>
</ul>
<h1>INSTALACIÓN</h1>
<p>Una vez que se haya instalado la extensión debemos asignarla a un grupo de herramienta desde el panel <strong>Personalizar panel de herramientas</strong> y listo ya se puede utilizar.</p>
<p><a href="http://www.nomeva.com/wp-content/uploads/2009/07/imagen-4.png"><img class="aligncenter size-medium wp-image-394" title="Personalizar panel herramientas" src="http://www.nomeva.com/wp-content/uploads/2009/07/imagen-4-300x127.png" alt="Personalizar panel herramientas" width="300" height="127" /></a></p>
<p>Dudas, sugerencias o comentarios, aquí estaré.</p>
<p>Saludos.</p>
<h3>Entradas relacionadas</h3>
<ul>
<li><a title="Recursos JSFL en nomeva.com" href="http://www.nomeva.com/2008/08/24/recursos-jsfl/" target="_blank">Recursos JSFL</a></li>
<li><a title="Tutorial JSFL - Introducción a comandos" href="http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">Tutorial JSFL &#8211; Introducción a comandos</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica" href="http://www.nomeva.com/2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica II" href="http://www.nomeva.com/2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica II</a></li>
<li><a title="Tutorial JSFL - Introducción a Paneles" href="http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank">Tutorial JSFL &#8211; Introducción a Paneles</a></li>
<li><a title="Tutorial JSFL - Panel Auto Save" href="http://www.nomeva.com/2009/06/28/tutorial-jsfl-panel-auto-save/" target="_blank">Tutorial JSFL &#8211; Panel Auto Save</a></li>
<li><a title="Tutorial JSFL - Guardar copia FLA 1/2 (comando)" href="http://www.nomeva.com/2009/07/05/tutorial-jsfl-guardar-copia-fla-12-comando/" target="_blank">Tutorial JSFL &#8211; Guardar copia FLA 1/2 (comando)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2009/07/17/tutorial-jsfl-introduccion-herramientas-tools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL &#8211; Timeline</title>
		<link>http://www.nomeva.com/2009/07/07/tutorial-jsfl-timeline/</link>
		<comments>http://www.nomeva.com/2009/07/07/tutorial-jsfl-timeline/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 06:31:19 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[frame]]></category>
		<category><![CDATA[layer]]></category>
		<category><![CDATA[mxp]]></category>
		<category><![CDATA[timeline]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=350</guid>
		<description><![CDATA[Desde siempre me han llamado la atención las marquesinas. Quizá por las veo muy habitualmente en el tren que viajo todos los días para ir de la casa al trabajo y del trabajo a casa, aunque ya desde mucho antes me gustaban. NOTA Puede ser interesante leer antes o después este otro post de Introducción a Comandos [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-351 aligncenter" title="marquesina lego jsfl" src="http://www.nomeva.com/wp-content/uploads/2009/07/marquesina_lego_jsfl.jpg" alt="marquesina lego jsfl" width="400" height="130" /></p>
<p>Desde siempre me han llamado la atención las <a title="Marquesina, texto animado, leds" href="http://wigflip.com/signbot/lj" target="_blank"><strong>marquesinas</strong></a>. Quizá por las veo muy habitualmente en el tren que viajo todos los días para ir de la casa al trabajo y del trabajo a casa, aunque ya desde mucho antes me gustaban.</p>
<blockquote><p><strong>NOTA</strong><br />
Puede ser interesante leer antes o después este otro <a title="Tutorial JSFL - Introducción a Comandos" href="../2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank"><strong>post</strong></a> de <strong>Introducción a Comandos</strong> para saber qué son, dónde van y cómo funcionan.</p></blockquote>
<h1>INTRODUCCIÓN</h1>
<p>Bueno, pues con esa idea en la cabeza se me ocurrió hacer un <strong>comando</strong> que en si mismo no tiene una utilidad claro, sino más bien abstracta o artística, pero que me viene muy bien para explicar el Objeto <a title="Objeto Timeline" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004463.html" target="_blank"><strong>Timeline</strong></a> de JSFL.</p>
<blockquote><p>El comando <strong>Escribir palabra</strong> no tiene una utilidad clara, es decir, no se creó con el fin de resolver un problema, sencillamente se hizo porque una tarde con una visión muy al estilo matrix (puede ser por la película o por una matriz) y con la nostalgia de las marquesinas de leds en la mente (quizá influenciado por las pantallas de los trenes de cercanías), si hizo.</p></blockquote>
<h1>TUTORIAL</h1>
<p>Primero utilizaremos el objeto <strong><a title="Objeto Document" href="http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00003804.html" target="_blank">Document</a> </strong>para acceder a su biblioteca (<strong><a title="Objeto library" href="http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00003804.html" target="_blank">library</a></strong>), creamos y editamos un MovieClip en ella y por último acceder a su línea de tiempo (<a title="Objeto Timeline" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004463.html" target="_blank"><strong>Timeline</strong></a>).</p>
<pre class="brush:js">var oDoc;
var oLib;
var oTimeline;

this.oDoc = fl.getDocumentDOM();
this.oLib = this.oDoc.library;
this.oLib.addNewItem("movie clip", "Nombre_MovieClip");
this.oLib.editItem("Nombre_MovieClip");
this.oTimeline = this.oDoc.getTimeline();</pre>
<p style="text-align: left;">Una vez que tenemos una referencia al objeto <a title="Objeto Timeline" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004463.html" target="_blank"><strong>Timeline</strong></a> podremos utilizar sus métodos y propiedades, en este caso vamos a utilizar el método <a title="Método addNewLayer del objeto Timeline" href="http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00003804.html" target="_blank"><strong>addNewLayer</strong></a> para agregar tantas capas como necesitemos.</p>
<pre class="brush:js">this.oTimeline.addNewLayer();</pre>
<p style="text-align: left;">Luego seleccionamos los <strong>fotogramas</strong> con los que vamos a trabajar, esto lo hacemos con el método <a title="Método setSelectedFrames del objeto Timeline" href="http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00003804.html" target="_blank"><strong>setSelectedFrames</strong></a> y los convertimos en <strong>fotogramas clave</strong>:</p>
<pre class="brush:js">this.oTimeline.setSelectedFrames(INICIO, FIN, REMPLAZAR_SELECCIÓN);
this.oTimeline.convertToKeyframes();</pre>
<p style="text-align: left;">Y listo lo siguiente es simplemente ir creando algo en cada fotograma en función de un patrón para que la línea de tiempo tenga forma. Una forma sencilla de hacer esto es dibujando un círculo en el escenario, de esta manera el fotograma dejará de estar vacío, para dibujar el círculo utilizamos el método <a title="Método addNewOval del objeto Document" href="http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00003804.html" target="_blank"><strong>addNewOval</strong></a> del objeto <a title="Objeto Document" href="http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00003804.html" target="_blank"><strong>Document</strong></a>:</p>
<pre class="brush:js">this.oDoc.addNewOval({left:0, top:0, right:10, bottom:10});</pre>
<p style="text-align: left;">El resultado al que queremos llegar es el que se muestra en la siguiente imagen.</p>
<blockquote>
<p style="text-align: left;"><em>Quizá sea mejor verlo desde lejos, porque muy cerca de la pantalla cuesta un poco leerlo.</em></p>
</blockquote>
<p style="text-align: center;"><img class="size-full wp-image-352 aligncenter" title="flash timeline jsfl" src="http://www.nomeva.com/wp-content/uploads/2009/07/flash_timeline_jsfl.png" alt="flash timeline jsfl" width="384" height="190" /></p>
<p style="text-align: left;">El código completo es el siguiente:</p>
<pre class="brush:js">var oDoc;
var oLib;
var oTimeline;
var aLetters;
var aWord;

this.config();

function config()
{
	fl.showIdleMessage(false);
	fl.outputPanel.clear();

	if(fl.getDocumentDOM())
	{
		this.oDoc = fl.getDocumentDOM();
		this.oLib = this.oDoc.library;

		this.init();
	}
	else
	{
		alert("Debes tener un documento abierto.");
	}
}

function init()
{
	this.configLetters();
	this.configWord();

	var nTotalLetters = this.aWord.length;
	for(var i = 0; i &lt; nTotalLetters; i++)
	{
		this.createLetter(this.aWord[i], i * 6);
	}
}

function configLetters()
{
	this.aLetters = new Array();

	this.aLetters[" "] = "0,0,0,0,0|0,0,0,0,0|0,0,0,0,0|0,0,0,0,0|0,0,0,0,0|0,0,0,0,0|0,0,0,0,0";
	this.aLetters["A"] = "0,1,1,1,0|1,0,0,0,1|1,0,0,0,1|1,1,1,1,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1";
	this.aLetters["B"] = "1,1,1,1,0|1,0,0,0,1|1,0,0,0,1|1,1,1,1,0|1,0,0,0,1|1,0,0,0,1|1,1,1,1,0";
	this.aLetters["C"] = "0,1,1,1,0|1,0,0,0,1|1,0,0,0,0|1,0,0,0,0|1,0,0,0,0|1,0,0,0,1|0,1,1,1,0";
	this.aLetters["D"] = "1,1,1,1,0|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,1,1,1,0";
	this.aLetters["E"] = "1,1,1,1,1|1,0,0,0,0|1,0,0,0,0|1,1,1,1,0|1,0,0,0,0|1,0,0,0,0|1,1,1,1,1";
	this.aLetters["F"] = "1,1,1,1,1|1,0,0,0,0|1,0,0,0,0|1,1,1,1,0|1,0,0,0,0|1,0,0,0,0|1,0,0,0,0";
	this.aLetters["G"] = "0,1,1,1,0|1,0,0,0,1|1,0,0,0,0|1,0,1,1,1|1,0,0,0,1|1,0,0,0,1|0,1,1,1,0";
	this.aLetters["H"] = "1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,1,1,1,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1";
	this.aLetters["I"] = "0,1,1,1,0|0,0,1,0,0|0,0,1,0,0|0,0,1,0,0|0,0,1,0,0|0,0,1,0,0|0,1,1,1,0";
	this.aLetters["J"] = "0,0,0,0,1|0,0,0,0,1|0,0,0,0,1|0,0,0,0,1|0,0,0,0,1|1,0,0,0,1|0,1,1,1,0";
	this.aLetters["K"] = "1,0,0,0,1|1,0,0,1,0|1,0,1,0,0|1,1,0,0,0|1,0,1,0,0|1,0,0,1,0|1,0,0,0,1";
	this.aLetters["L"] = "1,0,0,0,0|1,0,0,0,0|1,0,0,0,0|1,0,0,0,0|1,0,0,0,0|1,0,0,0,0|1,1,1,1,1";
	this.aLetters["M"] = "1,0,0,0,1|1,1,0,1,1|1,0,1,0,1|1,0,1,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1";
	this.aLetters["N"] = "1,0,0,0,1|1,0,0,0,1|1,1,0,0,1|1,0,1,0,1|1,0,0,1,1|1,0,0,0,1|1,0,0,0,1";
	this.aLetters["O"] = "0,1,1,1,0|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|0,1,1,1,0";
	this.aLetters["P"] = "1,1,1,1,0|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,1,1,1,0|1,0,0,0,0|1,0,0,0,0";
	this.aLetters["Q"] = "0,1,1,1,0|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,1,1|0,1,1,1,1";
	this.aLetters["R"] = "1,1,1,1,0|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,1,1,1,0|1,0,0,1,0|1,0,0,0,1";
	this.aLetters["S"] = "0,1,1,1,0|1,0,0,0,1|1,0,0,0,0|0,1,1,1,0|0,0,0,0,1|1,0,0,0,1|0,1,1,1,0";
	this.aLetters["T"] = "1,1,1,1,1|0,0,1,0,0|0,0,1,0,0|0,0,1,0,0|0,0,1,0,0|0,0,1,0,0|0,0,1,0,0";
	this.aLetters["U"] = "1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|0,1,1,1,0";
	this.aLetters["V"] = "1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|0,1,0,1,0|0,1,0,1,0|0,0,1,0,0";
	this.aLetters["W"] = "1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|1,0,1,0,1|1,0,1,0,1|1,1,0,1,1|1,0,0,0,1";
	this.aLetters["X"] = "1,0,0,0,1|1,0,0,0,1|0,1,0,1,0|0,0,1,0,0|0,1,0,1,0|1,0,0,0,1|1,0,0,0,1";
	this.aLetters["Y"] = "1,0,0,0,1|1,0,0,0,1|1,0,0,0,1|0,1,0,1,0|0,0,1,0,0|0,0,1,0,0|0,0,1,0,0";
	this.aLetters["Z"] = "1,1,1,1,1|0,0,0,0,1|0,0,0,1,0|0,0,1,0,0|0,1,0,0,0|1,0,0,0,0|1,1,1,1,1";
}

function configWord()
{
	sWord = prompt("Escribe una palabra.");

	this.aWord = new Array();
	var nWordLength = sWord.length;
	for(var i = 0; i &lt; nWordLength; i++)
	{
		this.aWord.push(sWord.substring(i, i + 1));
	}

	this.createTimeline(sWord);
}

function createTimeline(_sWord)
{
	var sWordLengthInFrames = _sWord.length * 6;
	this.oLib.addNewItem("movie clip", _sWord);
	this.oLib.editItem(_sWord);
	this.oTimeline = this.oDoc.getTimeline();
	this.oTimeline.setSelectedFrames(0, sWordLengthInFrames, true);
	this.oTimeline.convertToKeyframes();
	for(var i = 0; i &lt; 6; i++)
	{
		this.oTimeline.addNewLayer();
		this.oTimeline.setSelectedFrames(0, sWordLengthInFrames, true);
		this.oTimeline.convertToKeyframes();
	}
}

function createLetter(_sLetter, _nStartFrame)
{
	var sConfigLetter = this.aLetters[_sLetter];
	if(sConfigLetter)
	{
		var aConfigLetter = sConfigLetter.split("|");
		for(var i = 0; i &lt; 7; i++) aConfigLetter[i] = aConfigLetter[i].split(",");

		for(var i = 0; i &lt; 7; i++)
		{
			for(var j = 0; j &lt; 5; j++)
			{
				if(aConfigLetter[i][j] == "1")
				{
					this.oTimeline.setSelectedLayers(i);
					this.oTimeline.setSelectedFrames(_nStartFrame + j, _nStartFrame + j + 1, true);
					this.oDoc.addNewOval({left:0, top:0, right:10, bottom:10});
				}
			}
		}
	}
	else
	{
		alert("No existe el caracter: " + _sLetter);
	}
}</pre>
<h1>DESCARGAS</h1>
<p style="text-align: left;">Tenemos dos tipos de descargas, para instalar simplemente el comando y para descargar el JSFL:</p>
<ul>
<li><a title="Extensión Escribir palabra" href="http://www.nomeva.com/tutoriales/jsfl/Escribir_palabra_mxp.zip" target="_blank">Extensión</a> <strong>Escribir palabra</strong> (instalador mxp).</li>
<li><a title="Comando Escribir palabra" href="http://www.nomeva.com/tutoriales/jsfl/Escribir_palabra_jsfl.zip" target="_blank">Comando</a> <strong>Escribir palabra</strong> (fichero jsfl).</li>
</ul>
<p>Dudas, sugerencias o comentarios, aquí estaré.</p>
<p>Saludos.</p>
<h3>Entradas relacionadas</h3>
<ul>
<li><a title="Recursos JSFL en nomeva.com" href="../2008/08/24/recursos-jsfl/" target="_blank">Recursos JSFL</a></li>
<li><a title="Tutorial JSFL - Introducción a comandos" href="../2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">Tutorial JSFL &#8211; Introducción a comandos</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica" href="../2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica II" href="../2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica II</a></li>
<li><a title="Tutorial JSFL - Introducción a Paneles" href="../2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank">Tutorial JSFL &#8211; Introducción a Paneles</a></li>
<li><a title="Tutorial JSFL - Panel Auto Save" href="../2009/06/28/tutorial-jsfl-panel-auto-save/" target="_blank">Tutorial JSFL &#8211; Panel Auto Save</a></li>
<li><a title="Tutorial JSFL - Guardar copia FLA 1/2 (comando)" href="http://www.nomeva.com/2009/07/05/tutorial-jsfl-guardar-copia-fla-12-comando/" target="_blank">Tutorial JSFL &#8211; Guardar copia FLA 1/2 (comando)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2009/07/07/tutorial-jsfl-timeline/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL &#8211; Guardar copia FLA 1/2 (comando)</title>
		<link>http://www.nomeva.com/2009/07/05/tutorial-jsfl-guardar-copia-fla-12-comando/</link>
		<comments>http://www.nomeva.com/2009/07/05/tutorial-jsfl-guardar-copia-fla-12-comando/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 09:27:34 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[Extensiones]]></category>
		<category><![CDATA[fla]]></category>
		<category><![CDATA[mxp]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=340</guid>
		<description><![CDATA[Esta es la primera entrega de un grupo de dos tutoriales sobre una misma tarea, guardar una copia del documento Fla con el que se esta trabajando pero sin perder el documento actual en el IDE de Flash. Introducción Me explico mejor, existe la opción de Guardar como, pero esta opción lo que hace es abrir [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-343 aligncenter" title="document fla backup" src="http://www.nomeva.com/wp-content/uploads/2009/07/document_fla_backup.jpg" alt="document fla backup" width="214" height="159" /></p>
<p>Esta es la primera entrega de un grupo de dos <strong><a title="Tutoriales en nomeva.com" href="http://www.nomeva.com/category/tutoriales/" target="_blank">tutoriales</a></strong> sobre una misma tarea, <strong>guardar</strong> una <strong>copia</strong> del <strong>documento</strong> <a title="Documento Fla" href="http://filext.com/file-extension/fla" target="_blank"><strong>Fla</strong></a> con el que se esta trabajando pero sin perder el documento actual en el <strong>IDE</strong> de<strong> Flash.</strong></p>
<h1>Introducción</h1>
<p>Me explico mejor, existe la opción de <strong>Guardar como</strong>, pero esta opción lo que hace es abrir el cuadro de diálogo donde nos permite especificar la ruta y nombre del documento <a title="Documento Fla" href="http://filext.com/file-extension/fla" target="_blank"><strong>Fla</strong></a>, al hacer clic el guardar el documento que se queda en edición en el <strong>IDE</strong> de <strong>Flash</strong> es el nuevo. Pero, ¿que pasa si quiero trabajar sobre el mismo fichero?, porque lo que realmente quería hacer era una copia del documento, pues que tenemos que cerrar el documento nuevo y abrir el original.</p>
<p>Bueno para esto sirve el <strong>comando</strong> que vamos a hacer en este <strong>tutorial</strong>. En el siguiente tutorial vamos a hacer lo mismo pero lo haremos con un <strong>panel</strong> para ver las ventajas de un sistema sobre el otro.</p>
<blockquote><p><strong>NOTA</strong><br />
Puede ser interesante leer antes o después este otro <a title="Tutorial JSFL - Introducción a Comandos" href="http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank"><strong>post</strong></a> de <strong>Introducción a Comandos</strong> para saber qué son, dónde van y cómo funcionan.</p></blockquote>
<h1>Tutorial</h1>
<p>Para hacer la tarea de <strong>guardar</strong> una <strong>copia</strong> debemos primeramente guardar el documento en edición, esto lo hacemos mediante el método <a title="Método save del Objeto Document" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004635.html" target="_blank"><strong>save</strong></a> del objeto <strong><a title="Objeto Document" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004635.html" target="_blank">Document</a><span style="font-weight: normal;">,</span></strong></p>
<pre lang="javascript">fl.getDocumentDOM().save(true);</pre>
<p><strong><span style="font-weight: normal;">Una vez guardado el documento procedemos a realizar una copia, para esto hacemos uso del método </span><a title="Método copy del objeto FLfile" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004661.html#137637" target="_blank">copy</a><span style="font-weight: normal;"> del objeto </span><a title="Objeto FLfile" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004660.html" target="_blank">FLfile</a><span style="font-weight: normal;">, éste método recibe dos parámetros:</span></strong></p>
<ul>
<li><strong>Origen</strong>: La ruta del fichero que deseamos copia.</li>
<li><strong>Destino</strong>: La ruta del fichero resultante.</li>
</ul>
<blockquote><p><strong>NOTA</strong>:</p>
<p>Es importante destacar que las rutas deben estar expresadas en  <strong>file:///</strong></p></blockquote>
<p>Ya que las rutas las debemos especificar mediante  <strong>file:///</strong> haremos uso de una de las novedades de <strong>Flash CS4</strong>, me refiero a la propiedad <a title="Propiedad pathURI del objeto Document" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS9931616E-E7F0-41de-A90D-50B9342C8D04.html" target="_blank"><strong>pathURI</strong></a> del objeto <strong><a title="Objeto Document" href="http://help.adobe.com/es_ES/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7ffa.html" target="_blank">Document</a> </strong>ya<strong> </strong>que esta propiedad nos devuelve precisamente la <strong>ruta</strong> del <strong>documento</strong> <strong>Fla</strong> en edición expresda en <strong>file:///</strong>.</p>
<blockquote><p><strong>NOTA</strong>:</p>
<p>En caso de que el documento no haya sido guardado todavía el valor de la propiedad <strong>pathURI</strong> será <strong>udefined</strong> con lo que podemos controlar esa situación.</p></blockquote>
<p>El código que utilizaremos para hacer la copia sería el siguiente:</p>
<pre lang="javascript">FLfile.copy(fl.getDocumentDOM().pathURI, NUEVO_NOMBRE);</pre>
<p>El caso de que la copia se realice con éxito el método <a title="Método copy del objeto FLfile" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004661.html#137637" target="_blank"><strong>copy</strong></a> nos devolverá <strong>true</strong>, en caso contrario devolverá <strong>false</strong>, con lo cual también podemos controlar esa situación para informar al usuario.</p>
<p style="text-align: center;"><img class="size-full wp-image-344 aligncenter" title="command save copy" src="http://www.nomeva.com/wp-content/uploads/2009/07/command_save_copy.png" alt="command save copy" width="401" height="285" /></p>
<p>A continuación en código completo del commando:</p>
<pre lang="javascript">var oDoc;

this.config();

function config()
{
	fl.showIdleMessage(false);
	fl.outputPanel.clear();

	if(fl.getDocumentDOM())
	{
		this.oDoc = fl.getDocumentDOM();

		this.init();
	}
	else
	{
		alert("Debes tener un documento abierto.");
	}
}

function init()
{
	if(this.oDoc.pathURI)
	{
		this.oDoc.save(true);
		var bResult = FLfile.copy(this.oDoc.pathURI, this.oDoc.pathURI.split(".fla")[0] + "_back.fla");
		if(bResult)
		{
			alert("La copia se ha guardado correctamente.");
		}
		else
		{
			alert("Error al guardar la copia.");
		}
	}
	else
	{
		alert("El documento no ha sido guradado.\nPara crear una copia debes guardar antes el documento.");
	}
}</pre>
<h1>Descargas</h1>
<ul>
<li><a title="Extensión mxp save copy document" href="http://www.nomeva.com/tutoriales/jsfl/Guardar_copia_mxp.zip" target="_blank">Extensión para instalar el comando</a> (fichero mxp).</li>
<li><a title="save copy document jsfl" href="http://www.nomeva.com/tutoriales/jsfl/Guardar_copia_jsfl.zip" target="_blank">Fichero JSFL</a>.</li>
</ul>
<p>Dudas, sugerencias o comentarios, aquí estaré.</p>
<p>Saludos.</p>
<h3>Entradas relacionadas</h3>
<ul>
<li><a title="Recursos JSFL en nomeva.com" href="http://www.nomeva.com/2008/08/24/recursos-jsfl/" target="_blank">Recursos JSFL</a></li>
<li><a title="Tutorial JSFL - Introducción a comandos" href="http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">Tutorial JSFL &#8211; Introducción a comandos</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica" href="http://www.nomeva.com/2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica II" href="http://www.nomeva.com/2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica II</a></li>
<li><a title="Tutorial JSFL - Introducción a Paneles" href="http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank">Tutorial JSFL &#8211; Introducción a Paneles</a></li>
<li><a title="Tutorial JSFL - Panel Auto Save" href="http://www.nomeva.com/2009/06/28/tutorial-jsfl-panel-auto-save/" target="_blank">Tutorial JSFL &#8211; Panel Auto Save</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2009/07/05/tutorial-jsfl-guardar-copia-fla-12-comando/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL &#8211; Panel Auto Save</title>
		<link>http://www.nomeva.com/2009/06/28/tutorial-jsfl-panel-auto-save/</link>
		<comments>http://www.nomeva.com/2009/06/28/tutorial-jsfl-panel-auto-save/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 06:38:30 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[auto guardado]]></category>
		<category><![CDATA[auto save]]></category>
		<category><![CDATA[autoguardado]]></category>
		<category><![CDATA[autosave]]></category>
		<category><![CDATA[mxp]]></category>
		<category><![CDATA[panel]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=330</guid>
		<description><![CDATA[Bienvenido querido lector a la sección de tutoriales en nomeva, en esta ocasión vamos a crear con Flash mediante JSFL y ActionScript un Panel que realice la tarea de guardar automáticamente el documento Fla en edición. NOTA Puede ser interesante leer antes o después este otro post de Introducción a Paneles para saber qué son, [...]]]></description>
			<content:encoded><![CDATA[<div><img class="alignnone size-full wp-image-332" title="Memoria USB Lego" src="http://www.nomeva.com/wp-content/uploads/2009/06/usb_lego.jpg" alt="Memoria USB Lego" width="276" height="109" /></div>
<p>Bienvenido querido lector a la sección de <a title="Tutoriales en nomeva.com" href="http://www.nomeva.com/category/tutoriales/" target="_blank"><strong>tutoriales</strong></a> en <a title="nomeva.com" href="http://www.nomeva.com/" target="_blank"><strong>nomeva</strong></a>, en esta ocasión vamos a crear con <a title="Flash en nomeva.com" href="http://www.nomeva.com/category/flash/" target="_blank"><strong>Flash</strong></a> mediante<a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank"> <strong>JSFL</strong></a> y ActionScript un <strong>Panel</strong> que realice la tarea de guardar automáticamente el documento <a title="Documento Fla" href="http://filext.com/file-extension/fla" target="_blank">Fla</a> en edición.</p>
<blockquote><p><strong>NOTA</strong><br />
Puede ser interesante leer antes o después este otro <a title="Tutorial JSFL - Introducción a Paneles" href="http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank"><strong>post</strong></a> de <strong>Introducción a Paneles</strong> para saber qué son, dónde van y cómo funcionan.</p>
</blockquote>
<div></div>
<div style="text-align: center;"><img class="alignnone size-full wp-image-333" title="Panel Autoguardado" src="http://www.nomeva.com/wp-content/uploads/2009/06/imagen-2.png" alt="Panel Autoguardado" width="202" height="169" /></div>
<p><strong>Auto Save</strong> es un <strong>Panel</strong> (plugin) que en un principio(*) tiene una misión muy importante, guardar automáticamente el documento (<a title="Documento Fla" href="http://filext.com/file-extension/fla" target="_blank">fla</a>) con el cual estamos trabajando.</p>
<h5>(*)<strong>Digo en un principio porque al pensarlo bien, tal como funciona el IDE de Flash y sobre todo con la gran cantidad de fallos (bugs) que he encontrado en esta nueva versión de <a title="Adobe Flash CS4 Professional" href="http://www.adobe.com/es/products/flash/" target="_blank">Adobe Flash CS4 Professional</a> no estoy 100 % seguro si nos podrá ayudar o no. <img src='http://www.nomeva.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Con esto quiero decir que el uso de este Panel es bajo tu propio riesgo.</strong></h5>
<p>Ahora si, dicho todo lo anterior hablemos del Panel.</p>
<h2>CONFIGURACIÓN Y USO</h2>
<p>Es muy fácil de <strong>configurar</strong> el <strong>Panel</strong>, son únicamente tres valores:</p>
<ul>
<li><strong>Frecuencia</strong>: Como su nombre indica sirva para <strong>configurar la frecuencia</strong> el minutos del auto guardado.</li>
<li><strong>Preguntar</strong>: Si está <strong>activado</strong> antes de guardar te <strong>preguntará</strong> <strong>si deseas guardar</strong>, pudiendo responder que no y seguir tranquilamente con tu trabajo.</li>
<li><strong>Activo / Inactivo</strong>: Este es nuestro botón de <strong>encendido</strong>, con el cual indicamos que el <strong>auto guardado</strong> está activo o inactivo.</li>
</ul>
<p>Y ya está, así de fácil es configurar el <strong>Panel </strong>de<strong> Auto guardado</strong> de documentos <a title="Documento Fla" href="http://filext.com/file-extension/fla" target="_blank">Fla</a>. (Hola <strong>Gus</strong>!!!)</p>
<h2>Uso</h2>
<p>Para usar el <strong>Panel</strong> debemos abrirlo, desde el menú <strong>Ventana</strong> &gt; <strong>Otros paneles</strong> &gt; <strong>Auto save </strong>y configurarlo tal como indicamos arriba. Es importante mencionar que para que funcione debe estar visible, es decir, el Panel debe estar abierto. Tal como se muestra en la siguiente imagen.</p>
<h2>Un poco de historia</h2>
<p>Hablando con un amigo (Iván) me comentó una funcionalidad importantísima y es que recuerde la configuración porque sino sería un verdadero incordio tener que estar configurándolo cada vez que lo utilizas, así que <strong>SI</strong>, el <strong>Panel</strong> <strong>recuerda</strong> la <strong>configuración</strong> cada vez que lo cierras y lo abres e incluso si cierras el IDE de Flash.</p>
<h1>Descarga</h1>
<p>Para todo aquel que simplemente necesite el <strong>Panel Auto Save</strong> y no tenga interés en saber como funciona por dentro puede <strong>descargar </strong><a title="Instalador mxp Auto save Panel " href="http://www.nomeva.com/recursos/AutoSave.zip" target="_blank"><strong>aquí</strong></a> el instalador mxp.</p>
<p>A los que les interese saber como funciona sigan leyendo hasta el final que también hay otro enlace al instalador al final. ;D</p>
<h1>Parte friki, tutorial, código y demás</h1>
<p>Hasta ahora hemos hablado del <strong>Panel</strong> y sus beneficios (es verdad, también hemos hablado de las posibles no bondades <img src='http://www.nomeva.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ), pero todavía no sabemos <strong>cómo</strong> <strong>funciona</strong>, qué <strong>engranes</strong> se mueven por dentro, dónde está la <strong>magia</strong> y demás historias que en realidad es <span style="text-decoration: line-through;">lo que quiero contar</span> de lo que trata este post.</p>
<p>Pues vamos allá, jejeje, es que realmente el <strong>funcionamiento</strong> <strong>interno</strong> de este <strong>Panel</strong> es realmente <strong>sencillo</strong>, únicamente utilizamos dos métodos de <a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank"><strong>JSFL</strong></a>, uno para comprobar que exista un documento abierto y otro para guardar el documento, si, así de fácil.</p>
<h3>Explicación</h3>
<p>Para saber si existe un documento <a title="Documento Fla" href="http://filext.com/file-extension/fla" target="_blank">Fla</a> abierto utilizamos el <strong>método</strong> <a title="JSFL fl.getDocumentDOM()" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004635.html" target="_blank">fl.getDocumentDOM()</a> que nos devolverá un <strong>Objeto</strong> de tipo <strong><a title="Objeto Document" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004635.html" target="_blank">Document</a></strong> en caso de existir, en caso contrario nos devolverá <strong>undefined</strong>, con lo cual podemos hacer las comprobaciones necesarias en nuestro código <strong>ActionScript</strong>.</p>
<p>Lo siguiente que tenemos que hacer en caso de que <strong>exista</strong> el <strong>documento</strong> y que las variables de configuración del <strong>Panel</strong> (Frecuencia, Preguntar y Activo) nos los permitan es guardarlo, haciendo uso del <strong>método</strong> <a title="Método save del Objeto Document" href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00004635.html" target="_blank">fl.getDocumentDOM().save(true)</a> y listo.</p>
<h3>Resultado final</h3>
<p>En esta ocasión es más código <strong>ActionScript</strong> que código <a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank"><strong>JSFL</strong></a>, como en los anteriores post aquí también hacemos uso de la función <strong><a title="Función MMExecute" href="http://livedocs.adobe.com/flash/9.0_es/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00001194.html" target="_blank">MMExecute</a></strong> que nos permite ejecutar <a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank"><strong>JSFL</strong></a> desde un fichero <strong>swf</strong> con <strong>ActionScript</strong>.</p>
<p>A continuación os pongo el código. Hay un par de cosas feas por ahí, así que tener en cuenta que lo programé el viernes por la mañana mientras iba en el tren hacia el trabajo, así que si alguién lo quiere modificar para dejarlo más bonito o añadir funcionalidad es libre de hacerlo siempre y cuando mencione el origen (<span style="text-decoration: line-through;">y si no lo menciona también</span>, total, lo que quiero es compartir).</p>
<pre class="brush:js">import fl.controls.Button;
import fl.controls.CheckBox;
import fl.controls.Label;
import fl.controls.NumericStepper;
import flash.events.Event;

var nIntervalID:uint;
var nMinutesToAutoSave:uint;
var bCheckBoxAsk:Boolean;
var bActive:Boolean;

var comButtonOnOff:Button;
var comCheckBoxAsk:CheckBox;
var oLabel:Label;
var comNumericStepperFrecuency:NumericStepper;

var oSharedObject:SharedObject;

this.config();
this.init();

function config():void
{

	this.oSharedObject = SharedObject.getLocal("DATA_AUTOSAVE_SO");

	this.nMinutesToAutoSave = (this.oSharedObject.data.nMinutesToAutoSave != undefined) ? this.oSharedObject.data.nMinutesToAutoSave: this.comNumericStepperFrecuency.value;
	this.bCheckBoxAsk = (this.oSharedObject.data.bCheckBoxAsk != undefined) ? this.oSharedObject.data.bCheckBoxAsk: this.comCheckBoxAsk.selected;
	this.bActive = (this.oSharedObject.data.bActive != undefined) ? this.oSharedObject.data.bActive: false;

	this.comNumericStepperFrecuency.value = this.nMinutesToAutoSave;
	this.comCheckBoxAsk.selected = this.bCheckBoxAsk;
	if (this.bActive)
		this.comButtonOnOff.label = "On";
	else
		this.comButtonOnOff.label = "Off";

	this.comButtonOnOff.addEventListener(MouseEvent.CLICK, onClickButtonOnOff);
	this.comCheckBoxAsk.addEventListener(Event.CHANGE, onCheckBoxAskChange);
	this.comNumericStepperFrecuency.addEventListener(Event.CHANGE, onNumericStepperFrecuencyChange);

	this.saveSharedObject();
}

function saveSharedObject():void
{
	this.oSharedObject.data.nMinutesToAutoSave = this.nMinutesToAutoSave;
	this.oSharedObject.data.bCheckBoxAsk = this.bCheckBoxAsk;
	this.oSharedObject.data.bActive = this.bActive;

	this.oSharedObject.flush();
}

function onClickButtonOnOff(_oMouseEvent:MouseEvent):void
{
	if (this.bActive)
	{
		this.bActive = false;
		this.comButtonOnOff.label = "On";
	}
	else
	{
		this.bActive = true;
		this.comButtonOnOff.label = "Off";

		this.init();
	}

	this.saveSharedObject();
}

function onCheckBoxAskChange(_oEvent:Event):void
{
	this.bCheckBoxAsk = this.comCheckBoxAsk.selected;

	this.saveSharedObject();
}

function onNumericStepperFrecuencyChange(_oEvent:Event):void
{
	this.nMinutesToAutoSave = this.comNumericStepperFrecuency.value;

	this.init();

	this.saveSharedObject();
}

function init():void
{
	clearInterval(this.nIntervalID);
	this.nIntervalID = setInterval(autoSave, this.nMinutesToAutoSave * 60 * 1000);
}

function autoSave():void
{
	if (this.bActive &amp;&amp; this.isDocument())
	{
		if (this.comCheckBoxAsk.selected)
		{
			var sCodeJSFL:String = "";
			var sResult:String = "";

			sCodeJSFL = "confirm(\"Quieres guardar\");";
			sResult = MMExecute(sCodeJSFL);

			if (sResult == "true")
			{
				this.saveDocument();
			}
		}
		else
		{
			this.saveDocument();
		}
	}
}

function isDocument():Boolean
{
	var bRet:Boolean;

	var sCodeJSFL:String = "";
	var sResult:String = "";
	sCodeJSFL = "fl.getDocumentDOM();";
	sResult = MMExecute(sCodeJSFL);
	bRet = (sResult != "undefined") ? true: false;

	return bRet;
}

function saveDocument():void
{
	var sCodeJSFL:String = "";
	var sResult:String = "";
	sCodeJSFL = "fl.getDocumentDOM().save(true);";
	sResult = MMExecute(sCodeJSFL);
}</pre>
<p>Aquí tenéis los archivos de descarga.</p>
<ul>
<li><a title="Panel Auto Save mxp" href="http://www.nomeva.com/recursos/AutoSave.zip" target="_blank">Instalador MXP</a></li>
<li><a title="Código fuente tutorial jsfl panel auto save" href="http:///www.nomeva.com/tutoriales/jsfl/auto_save.zip" target="_blank">Código fuente</a> (Fla)</li>
</ul>
<p>Sugerencias, dudas, ideas o comentarios?</p>
<p>Saludos!!!</p>
<p>Entradas relacionadas:</p>
<ul>
<li><a title="Recursos JSFL en nomeva.com" href="http://www.nomeva.com/2008/08/24/recursos-jsfl/" target="_blank">Recursos JSFL</a></li>
<li><a title="Tutorial JSFL - Introducción a comandos" href="http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">Tutorial JSFL &#8211; Introducción a comandos</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica" href="http://www.nomeva.com/2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica II" href="http://www.nomeva.com/2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica II</a></li>
<li><a title="Tutorial JSFL - Introducción a Paneles" href="http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/" target="_blank">Tutorial JSFL &#8211; Introducción a Paneles</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2009/06/28/tutorial-jsfl-panel-auto-save/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL &#8211; Introducción a Paneles</title>
		<link>http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/</link>
		<comments>http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 15:05:02 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Paneles]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[MMExecute]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=303</guid>
		<description><![CDATA[Esta es la tercera entrega de los tutoriales sobre JSFL que en su momento me propuse escribir, con ésta cerraré el paquete de introducción, pero no todo termina aquí, pues han cambiado mucho las cosas desde que empecé a escribir, he aprendido nuevas cosas, me he tenido que enfrentar a nuevos retos y tengo nuevas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class=" aligncenter" title="Tablero" src="http://www.nomeva.com/imagenes/tablero_ajedrez.jpg" alt="Tablero" width="420" height="263" /></p>
<p>Esta es la tercera entrega de los<a title="Tutoriales en nomeva.com" href="http://www.nomeva.com/category/tutoriales/" target="_blank"> tutoriales</a> sobre <a title="JSFL en nomeva.com" href="http://www.nomeva.com/category/jsfl/" target="_blank">JSFL</a> que en su momento me propuse escribir, con ésta cerraré el paquete de introducción, pero no todo termina aquí, pues han cambiado mucho las cosas desde que empecé a escribir, he aprendido nuevas cosas, me he tenido que enfrentar a nuevos retos y tengo nuevas ideas sobre que escribir y como aplicar estos conocimientos a situaciones reales para ayudarnos en nuestro día a día. Bueno, sin más preámbulos vamos a lo que nos compete.</p>
<p>En esta ocasión veremos los <strong>Paneles</strong>, los paneles son películas SWF que almacenamos en las siguientes rutas respectivamente en función del sistema operativo:</p>
<ul>
<li>Windows® VistaTM:</li>
</ul>
<p>unidad de arranque\Users\nombre de usuario\Local Settings\Application Data\Adobe\Flash CS4\idioma\Configuration\<strong>WindowSWF</strong></p>
<ul>
<li>Windows XP:</li>
</ul>
<p>unidad de arranque\Documents and Settings\nombre de usuario\Local Settings\Application Data\Adobe\Flash CS4\idioma\Configuration\<strong>WindowSWF</strong></p>
<ul>
<li>Mac OS® X:</li>
</ul>
<p>Macintosh HD/Usuarios/nombre de usuario/Librería/Application Support/Adobe/Flash CS4/idioma/Configuration/<strong>WindowSWF </strong></p>
<p>El acceso a estos paneles lo hacemos a través del menú <strong>Ventana -&gt; Otros</strong> <strong>paneles</strong>, aquí encontraremos todos los <strong>Paneles</strong> que creemos dentro del directorio <strong>WindowSWF</strong>.</p>
<address>¿Para que sirven los paneles? y ¿Qué podemos hacer con un panel?</address>
<p>Bueno, básicamente podemos hacer todo lo que hacen los <a title="Tutorial JSFL - Introducción a Comandos" href="http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">comandos</a>, pero con la ventaja de tenerlo siempre abierto.</p>
<address>¿Y eso que quiere decir?</address>
<p>Pues que por ejemplo para ejecutar un comando tenemos que hacerlo a través del menú <strong>Comandos</strong>, con lo cual perdemos el área de trabajo, esto si utilizamos un comando basado en interfaz gráfica, pero si lo hacemos con un comando sencillo no tenemos forma de configurar parámetros con lo que perdemos más valor. Sin embargo con un <strong>Panel</strong> tenemos siempre visible el área de trabajo, tenemos acceso a toda la configuración que deseemos implementar en el panel y además podemos crear previews del resultado puesto que el panel es una película <strong>swf</strong> en la que podemos hacer tanto como deseemos.</p>
<address>A ver, a ver, ¿dices que los <strong>Paneles</strong> son películas <strong>SWF</strong>?</address>
<p>Así es, esta es la parte más poderosa de los <strong>Paneles</strong>, que son películas <strong>SWF</strong>, con lo cual las podemos crear con lo que más cómodos nos sintamos, por ejemplo con <strong>Flex</strong>, con <strong>Flash</strong>, con <strong>mtasc</strong>, todos estos los he probado y funcionan perfectamente, seguro que también se puede con <strong>HAXE</strong> aunque no lo he probado.</p>
<address>¿Y donde está el truco?</address>
<p>Bueno, realmente no es truco, pero bueno la magia que nos permite hacer esto es una función muy sencilla que lleva mucho tiempo ahí y que es más potente de lo que ha simple vista parece, la función que nos permite utilizar a nuestros queridos <strong>SWF&#8217;s</strong> como interfaz de los <strong>Paneles</strong> es la función <strong>MMExecute</strong>, a ésta función le tenemos que pasar como parámetro código JSFL y listo.</p>
<blockquote><p><strong>NOTA</strong> del escritor, osea yo, jejejeje<br />
Una buena práctica es el encapsulamiento y además conseguir que nuestro <strong>Panel</strong> tenga poco acoplamiento. Esto es más sencillo de lo que suena, simplemente quiere decir que separemos el código AS y el código JSFL.</p></blockquote>
<h2>PARTE ActionScript, lógica de la vista del Panel</h2>
<p>Bueno y ahora si por fin después de esta introducción ya podemos hablar sobre la forma en la que vamos a poner en práctica lo aprendido (pero que dice este tío, si lo único que hemos visto es la función MMExecute y una ruta rara) . Vamos a crear un Panel que nos ayude a crear tableros de ajedrez, si esos bellos tableros que se componen de 64 casillas, 8 filas y 8 columnas, alternando dos tipos de casillas.</p>
<p>Recuerdo que hace tiempo tomé un taller sobre ActionScript avanzado en el <a title="Flash For México" href="http://www.flashformexico.org/" target="_blank">Flash For México 2004</a> que impartió <a title="Fernando Flores" href="http://funciton.com/" target="_blank">Fernando Flores</a>, ahí antes de empezar a picar código nos dijo una cosa que siempre recordaré y que sigo aplicando a diario en mis proyectos, la lista de la compra, o sea lo que queremos, lo que necesitamos de nuestra aplicación. En este caso que es lo que queremos que tenga este <strong>Panel</strong>, bueno, pues mi lista de la compra para este Panel es la siguiente:</p>
<ul>
<li>Definir el tamaño de las casillas.</li>
<li>Definir el color de las casillas.</li>
<li>Tener un preview antes de crearlo.</li>
</ul>
<p>Esta lista de la compra nos ayuda a saber que necesitaremos 2 instancias del Componente <strong>ColorPicker</strong>, una instancia del Componente <strong>NumericStepper</strong> y para ejecutar acciones el buen amigo<strong> Button</strong>. Con ellos tendremos la lógica de AS que nos ayudará a conseguir los valores necesarios para crear nuestro tablero.</p>
<p>Una vez que conseguimos los valores necesario hacemos la llamada al fichero JSFL encargado de crear el tablero, la llamada a este fichero es realmente la clave de éste <strong>Panel</strong>. El código es el siguiente:</p>
<pre lang="javascript">MMExecute('fl.runScript( fl.configURI + "WindowSWF/JavaScript/Tablero.jsfl", "createBoard", ' + this.comColor1.selectedColor + ', ' + this.comColor2.selectedColor + ', ' + this.comNumericStepperSize.value + ' );');</pre>
<p>La explicación de ese trozo de código es la siguiente:</p>
<p><strong>MMExecute</strong>, esta función recibe como parámetro el código JSFL que deseamos ejecutar.</p>
<p><strong>fl.runScript</strong>, esté método de sirve para ejecutar scripts con código JSFL. Recibe un parámetro obligatorio y dos opcionales, que en nuestro caso utilizamos.</p>
<ul>
<li>El primero es la ruta del fichero JSFL que se desea ejecutar.</li>
<li>El segundo es el nombre de la función que se desea ejecutar dentro del fichero JSFL.</li>
<li>El tercero son los parámetros que enviamos a la función.</li>
</ul>
<p><strong>fl.configURI</strong>, esta propiedad nos devuelve la ruta de la carpeta configuration de Flash del equipo.</p>
<p>Hasta ahora lo único que hemos hecha ha sido simplemente llamar a un fichero JSFL alojado en la carpeta configuration/WindowSWF/JavaScript/<strong>Tablero.jsfl</strong>, hemos indicado que deseamos ejecutar la función <strong>createBoard</strong> dentro de este fichero y le hemos pasado los parámetros necesarios (<strong>Color1</strong>, <strong>Color2</strong> y <strong>Tamaño</strong>).</p>
<p>Y ya está, nuestro <strong>Panel</strong> es así de simple, podemos hacer todo lo que nos venga en gana para hacerlo más bonito, con animaciones, diseños y demás, pero lo mínimo necesario para funcionar es lo que hemos hecho hasta ahora. Bueno, ahora si empieza la parte interesante que es la que desde el principio quiero explicar, lo que es realmente código JSFL y es el encargado de crear el tablero de Ajedrez. ¿Preparados? &#8230; Pues vamos allá.</p>
<p>Pero antes una imagen que como queda nuestra interfaz:</p>
<p style="text-align: center;"><img class=" aligncenter" title="Panel Tablero" src="http://www.nomeva.com/imagenes/panel_tablero.png" alt="Panel Tablero" width="278" height="358" /></p>
<h2>PARTE JSFL, lógica de &#8230; algo que no es la vista del Panel</h2>
<p>Llegamos a este punto con una parte muy importante ya definida y es la función a la que se llama desde ActionScript con la función <strong>MMExecute</strong>, si, así es, me refiero a la función <strong>createBoard</strong>, pero no sólo sabemos que tenemos que crear esa función, también sabemos que recibe <strong>tres parámetros</strong>, con lo cual ya nos hacemos a la idea de algunas tareas que tendremos que hacer. Pero bueno, vamos a pensarlo un poco más para ver que elementos necesitaremos, teniendo en cuenta que el tablero sea fácil de usar y modificar.<br />
Bueno, pues partiendo de estas premisas y pensando lo más fácil posible, planteo la creación de tres <strong>MovieClip&#8217;s</strong>.</p>
<ol>
<li><strong>Caja 1</strong>, que será un cuadrado de las dimensiones  y el color indicados por parámetro.</li>
<li><strong>Caja 2</strong>, que es lo mismo que la caja 1 pero con el otro color.</li>
<li><strong>Tablero</strong>, éste tendrá 32 instancias de cada Caja para formar el tablero.</li>
</ol>
<p>Bueno, ahora si con las cosas claras es más fácil programar, entonces vamos por partes, hemos dicho que necesitamos crear MovieClip&#8217;s, esto es muy sencillo, para hacerlo necesitamos utilizar el método <strong>addNewItem</strong> del Objeto<strong> library</strong>, éste método recibe dos parámetros, el tipo de Item y el nombre del mismo. A continuación un ejemplo:</p>
<pre lang="javascript">fl.getDocumentDOM().library.addNewItem("movie clip", "nombre del MovieClip");</pre>
<p>Luego necesitamos editar el MovieClip creado en el paso anterior, esto lo hacemos con el método <strong>editItem</strong> del Objeto <strong>library</strong>, éste método recibe como parámetro el nombre del Item que deseamos editar. A continuación un ejemplo:</p>
<pre lang="javascript">fl.getDocumentDOM().library.editItem("nombre del MovieClip");</pre>
<p>Ahora dentro del MovieClip antes de dibujar el cuadro debemos definir el color, esto lo hacemos con el método <strong>setCustomFill</strong> del Objeto <strong>Document</strong>, éste método recibe un objeto como parámetro, donde indicamos el color y el estilo de relleno. A continuación un ejemplo:</p>
<pre lang="javascript">fl.getDocumentDOM().setCustomFill( {color:_nColor, style:"solid"} );</pre>
<p>Una vez que hemos definido el color del cuadro ya podemos dibujarlo, esto lo hacemos con el método <strong>addNewRectangle</strong> del Objeto <strong>Document</strong>, éste método recibe dos parámetros, un objeto con la posición y las dimensiones del rectángulo que crearemos y el factor de redondeo de las esquinas del mismo. A continuación un ejemplo:</p>
<pre lang="javascript">fl.getDocumentDOM().addNewRectangle( { left:0, top:0, right:Tamaño, bottom:Tamaño }, 0);</pre>
<p>Listo, con estos pasos hemos conseguido crear un MovieClip, editarlo, definir un color de relleno y dibujar un cuadro, ahora simplemente tenemos que salir del modo edición de éste MovieClip, esto lo hacemos con el método <strong>exitEditMode</strong> del Objeto <strong>Document</strong>. A continuación un ejemplo:</p>
<pre lang="javascript">fl.getDocumentDOM().exitEditMode();</pre>
<p>Repetimos estos pasos y conseguiremos crear el segundo cuadro.</p>
<blockquote><p><strong>NOTA</strong><br />
Una buena práctica es encapsular estos pasos en una función para reutilizarla en más ocasiones.</p></blockquote>
<p>Bueno, con esto ya tenemos dos MovieClip&#8217;s en la biblioteca, del tamaño y color deseados, ahora nos queda montar el tablero. Para esto necesitaremos crear otro MovieClip e instanciar 64 Items de la biblioteca, 32 de un color y 32 de otro. Esto lo conseguiremos con el siguiente código,:</p>
<pre lang="javascript">fl.getDocumentDOM().library.addNewItem("movie clip", "tablero");
fl.getDocumentDOM().library.editItem("tablero");
var n = 0;
for (var i = 1; i &lt;= 8; i++)
{
    for (var j = 1; j &lt;= 8; j++)
    {
        var sItemName = (n % 2 == 0) ? "casilla1" : "casilla2";
        fl.getDocumentDOM().library.addItemToDocument({x:(j - 1) * _nSize, y:(i - 1) * _nSize}, sItemName);
        n++;
    }
    n++;
}
fl.getDocumentDOM().exitEditMode();</pre>
<p>De ese código la parte nueva que vemos de JSFL es el método <strong>addItemToDocument</strong>, del Objeto <strong>library</strong>, éste método nos permite instanciar elementos de la <strong>biblioteca</strong> en el <strong>escenario</strong>, recibe dos parámetros, el primero es un objeto con las coordenadas X e Y en las que deseamos instanciar el Item y el segundo es una cadena con el nombre del Item que deseamos instanciar.</p>
<p>Y listo, eso ha sido todo, quizá contado trozo a trozo no tenga mucho sentido, pero mi intención era explicar cada uno de los método utilizados. A continuación pongo el código JSFL completo://Declaración de variables</p>
<pre lang="javascript">var oDoc;
var oLib;
var sBoxName1 = "box_1";
var sBoxName2 = "box_2";
var sBoardName = "board";

/**
* @method	createBoard
* Método encargado de crear un tablero.
* @param	_nColor1	Number		Número que indica el color primario del tablero
* @param	_nColor2	Number		Número que indica el color secundario del tablero
* @param	_nSize		Number		Número que indica el tamaño de las casillas
* @return	Void
*/
function createBoard(_nColor1, _nColor2, _nSize)
{
    if (this.config())
    {
        //Lamada al método createBox para crear MovieClp's
        this.createBox(this.sBoxName1, _nSize, _nColor1);
        this.createBox(this.sBoxName2, _nSize, _nColor2);

        //Hacemos una comprobación, si existen el item en la biblioteca lo eliminamos.
        if (this.oLib.itemExists(this.sBoardName))	this.oLib.deleteItem(this.sBoardName);

        //Creamos y editamos el MovieClip tablero
        this.oLib.addNewItem("movie clip", this.sBoardName);
        this.oLib.editItem(this.sBoardName);
        var n = 0;
        for (var i = 1; i &lt;= 8; i++)
        {
            for (var j = 1; j &lt;= 8; j++)
            {
                var sItemName = (n % 2 == 0) ? this.sBoxName1 : this.sBoxName2;
                //Añadimos al MovieClip una instancia de la casilla en su posición correspondiente
                this.oLib.addItemToDocument({x:(j - 1) * _nSize, y:(i - 1) * _nSize}, sItemName);
                n++;
            }
            n++;
        }

        //Salimos del modo de edición y volvemos al escenario
        this.oDoc.exitEditMode();
    }
}

/**
* @method	createBox
* Método encargado de crear un Item de tipo MovieClip en la biblioteca, editarlo y dentro crear un cuadro de tamaño y color indicados por parámetro.
* @param	_sName		String		Cadena que indica el nombre del Item que se creará en la biblioteca.
* @param	_nSize		Number		Número que indica el tamaño del cuadro que se creará.
* @param	_nColor		Number		Número que indica el color del cuadro que se creará.
* @return	Void
*/
function createBox(_sName, _nSize, _nColor)
{
    //Hacemos una comprobación, si existen el item en la biblioteca lo eliminamos.
    if (this.oLib.itemExists(_sName))	this.oLib.deleteItem(_sName);

    //Añadimos y editamos el MovieClip
    this.oLib.addNewItem("movie clip", _sName);
    this.oLib.editItem(_sName);
    //Definimos el color y estilo del trazo
    this.oDoc.setCustomStroke( {color:"#000000", thickness:1} );
    //Definimos el color y estilo de relleno del cuadro
    this.oDoc.setCustomFill( {color:_nColor, style:"solid"} );
    //Dibujamos el cuadro
    this.oDoc.addNewRectangle( { left:0, top:0, right:_nSize, bottom:_nSize }, 0);
    //Salimos del modo de edición y volvemos al escenario
    this.oDoc.exitEditMode();
}

/**
* @method	config
* Método encargado de la configuración del JSFL
* @return	Void
*/
function config()
{
    fl.showIdleMessage(false);
    fl.outputPanel.clear();

    var ret = false;

    if(fl.getDocumentDOM())
    {
        //Obtenemos y configuramos las referencias al Documento y a la Biblioteca
        this.oDoc = fl.getDocumentDOM();
        this.oLib = this.oDoc.library;
        ret = true;
    }
    else
    {
        alert("Debes tener un documento abierto.");
    }

    return ret;
}</pre>
<p><a title="Archivos del Tutorial" href="http://www.nomeva.com/tutoriales/jsfl/panel_tablero.zip" target="_blank">Aquí</a> se pueden descargar los ficheros de este tutorial. Cualquier, duda, sugerencia o comentario, aquí estaré.</p>
<p>Entradas relacionadas:</p>
<ul>
<li><a title="Recursos JSFL en nomeva.com" href="http://www.nomeva.com/2008/08/24/recursos-jsfl/" target="_blank">Recursos JSFL</a></li>
<li><a title="Tutorial JSFL - Introducción a comandos" href="http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">Tutorial JSFL &#8211; Introducción a comandos</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica" href="http://www.nomeva.com/2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica</a></li>
<li><a title="Tutorial JSFL - Comandos con interfaz gráfica II" href="http://www.nomeva.com/2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/" target="_blank">Tutorial JSFL &#8211; Comandos con interfaz gráfica II</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2009/04/24/tutorial-jsfl-introduccion-a-paneles/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL &#8211; Comandos con interfaz gráfica II</title>
		<link>http://www.nomeva.com/2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/</link>
		<comments>http://www.nomeva.com/2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 14:19:37 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[comandos]]></category>
		<category><![CDATA[FLfile]]></category>
		<category><![CDATA[Interfaz gráfica]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=238</guid>
		<description><![CDATA[Este tutorial continua la serie de tutoriales de JSFL que empecé a escribir en este post, no es el tercero sino la segunda parte del segundo tutorial de Comandos con interfaz gráfica. En esta ocasión vamos a crear un comando que nos ayude a crear un XML con el listado de ficheros jpg que se [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="Comando Crea XML de imágenes" src="http://www.nomeva.com/imagenes/crea_xml_imagenes.jpg" alt="" width="370" height="230" /></p>
<p>Este tutorial continua la serie de <a href="../../../../../category/tutoriales/">tutoriales</a> de <strong><a href="../../../../../category/jsfl/">JSFL</a></strong> que empecé a escribir en este <a href="../../../../../2008/09/26/tutorial-jsfl-introduccion-a-comando/">post</a>, no es el tercero sino la segunda parte del <a href="../../../../../2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/">segundo tutorial</a> de <strong>Comandos con interfaz gráfica</strong>.</p>
<p>En esta ocasión vamos a crear un comando que nos ayude a crear un <strong><a href="http://es.wikipedia.org/wiki/XML">XML</a></strong> con el listado de ficheros <strong><a href="http://es.wikipedia.org/wiki/JPEG">jpg</a></strong> que se encuentran en un directorio que indicaremos mediante un cuadro de diálogo <strong>Buscar carpeta</strong>.</p>
<p>En este tutorial veremos lo siguiente:</p>
<ul class="unIndentedList">
<li> Interfaz gráfica basada en una película <strong><a href="http://es.wikipedia.org/wiki/Animaciones_Flash">swf</a></strong>.</li>
<li> Uso de <strong><em>Función <a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflash%2F9.0_es%2Fmain%2F00001194.html&amp;ei=18EWSezKMoyE0QTmra2GCw&amp;usg=AFQjCNGeMJW8TlQO508U7T9HIBBGU_JpJw&amp;sig2=nn9mSHwSlkNoQUYeaD58DQ">MMExecute</a></em></strong>.</li>
<li> Uso de cuadro de diálogo <strong>Buscar carpeta</strong>.</li>
<li> Introducción al <strong><em>objeto <a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflash%2F9.0_es%2Fmain%2F00004188.html&amp;ei=CsYWSeKsCY760QSDxezsCg&amp;usg=AFQjCNHaJDEYD_sTq3YGM3k1gA83JVKerQ&amp;sig2=x5DKiU9q9skRq3U6oOGspg">FLfile</a></em></strong>.</li>
</ul>
<h3><strong>Interfaz gráfica basada en una película swf</strong></h3>
<p>Lo primero que debemos hacer es indicar en el fichero JSFL el uso de un xmlPanel mediante el siguiente código:</p>
<pre lang="javascript">fl.getDocumentDOM().xmlPanel(fl.configURI + "panel.xml");</pre>
<p>Lo siguiente que debemos hacer es indicar en el fichero xml de configuración de interfaz gráfica del comando el uso de una película Flash, mediante el siguiente código:</p>
<pre lang="xml"><flash src="panel.swf" width="370"   height="230"  id="settings" /></pre>
<p>Listo, con esto ya tenemos un comando que utiliza un fichero xml para configurar su interfaz gráfica y esta interfaz muestra una película swf.</p>
<h3><strong>Uso de <em>Función MMExecute</em></strong></h3>
<p>La función <strong><a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflash%2F9.0_es%2Fmain%2F00001194.html&amp;ei=18EWSezKMoyE0QTmra2GCw&amp;usg=AFQjCNGeMJW8TlQO508U7T9HIBBGU_JpJw&amp;sig2=nn9mSHwSlkNoQUYeaD58DQ">MMExecute</a></strong> sirve para ejecutar scripts JSFL desde una película swf, esto lo vamos a necesitar en este tutorial para ejecutar las siguientes acciones:</p>
<ul class="unIndentedList">
<li> Aceptar
<pre lang="javascript">MMExecute(‘fl.xmlui.accept();');</pre>
</li>
<li> Cancelar
<pre lang="javascript">MMExecute(‘fl.xmlui.cancel();');</pre>
</li>
<li> Asignar valor
<pre lang="javascript">MMExecute(‘fl.xmlui.set("variable", "valor");');</pre>
</li>
<li> Abrir cuadro de diálogo <strong>Buscar carpeta</strong>
<pre lang="javascript">MMExecute(‘fl.browseForFolderURL("Mensaje");‘);</pre>
</li>
</ul>
<p>Este código lo podemos ejecutar en eventos de botones como onClick, onRelease, etcétera desde nuestra interfaz de usuario.</p>
<p>La función <strong><a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflash%2F9.0_es%2Fmain%2F00001194.html&amp;ei=18EWSezKMoyE0QTmra2GCw&amp;usg=AFQjCNGeMJW8TlQO508U7T9HIBBGU_JpJw&amp;sig2=nn9mSHwSlkNoQUYeaD58DQ">MMExecute</a></strong> devuelve una cadena cuando la ejecución del script JSFL devuelve algo. <strong>NOTA importante</strong>, el resultado de MMExecute siempre será una cadena.</p>
<h3><strong>Uso de cuadro de diálogo Buscar Carpeta</strong></h3>
<p>Para abrir un cuadro de diálogo <strong>Buscar carpeta</strong> debemos ejecutar el siguiente código:</p>
<pre lang="javascript">var ruta:String = fl.browseForFolderURL("Mensaje");</pre>
<p>Este nos devolverá la ruta hasta la carpeta expresada como <strong><em>archivo:///URI </em></strong>que es el formato que utiliza JSFL para trabajar con el sistema de ficheros. Por ejemplo, en Windows para la carpeta <strong>D:\Fotos</strong> sería <strong>file:///D|/Fotos</strong>.</p>
<h3><strong>Introducción al objeto FLfile</strong></h3>
<p>El objeto <strong><a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflash%2F9.0_es%2Fmain%2F00004188.html&amp;ei=CsYWSeKsCY760QSDxezsCg&amp;usg=AFQjCNHaJDEYD_sTq3YGM3k1gA83JVKerQ&amp;sig2=x5DKiU9q9skRq3U6oOGspg">FLfile</a></strong> nos proporciona una <strong><a href="http://es.wikipedia.org/wiki/API">API</a></strong> de comunicación con el sistema de ficheros del sistema operativo poder <em>crear</em>, <em>modificar</em> o <em>eliminar</em> entre otras cosas<strong> ficheros</strong> o <strong>directorios</strong>. Este objeto lo vamos a utilizar en este tutorial para ejecutar las siguientes acciones:</p>
<ul class="unIndentedList">
<li> Listar el contenido de un directorio
<pre lang="javascript">FLfile.listFolder("path", "files");</pre>
</li>
<li> Crear un fichero
<pre lang="javascript">FLfile.write("fileURI", "contenido fichero");</pre>
</li>
</ul>
<p>El método FLfile.<strong>listFolder</strong> nos permite aplicar un filtro de búsqueda de tal forma que el resultado sólo incluya ficheros de cierto tipo, para nuestro ejemplo aplicamos el filtro de búsqueda para fichero de tipo <strong><a href="http://es.wikipedia.org/wiki/JPEG">jpg</a></strong>, esto lo conseguimos con el siguiente código:</p>
<pre lang="javascript">FLfile.listFolder(path + "/*.jpg", "files");</pre>
<p>Este método devuelve un array con los resultados de la búsqueda.</p>
<p>El método FLfile.<strong>write</strong> nos permite crear un fichero, este método devuelve un valor de tipo booleano que indica el éxito de la operación al crear el fichero. Para nuestro ejemplo utilizamos este método para <strong>crear</strong> el fichero XML con el listado de los ficheros jpg del directorio indicado mediante el cuadro de diálogo <strong>Buscar carpeta</strong>.</p>
<p>Listo, ahora si ya hemos hablado sobre los puntos importantes que trata este comando, sobre todo de las nuevas funciones y los nuevos métodos que utilizamos. A continuación pongo el código de de los distintas partes que componen este comando.</p>
<p><strong>Fichero JSFL</strong> de nombre Crea XML de imágenes.jsfl</p>
<pre lang="javascript">//Declaración de variables
var oDoc;
var oCfg;
var sDirPath;
var sNameFile;

//Llamadas al método de configuración
this.config();

/**
 * @method	config
 * Método encargado de la configuración del comando
 * @return	Void
 */
function config()
{
	//Limpiamos el panel de salida
	fl.outputPanel.clear();

	//Obtenemos las referencias al documento
	this.oDoc = fl.getDocumentDOM();
	if(this.oDoc)
	{
		//Obtenemos una referencia al objeto de configuración de la interfaz gráfica
		this.oCfg = this.oDoc.xmlPanel(fl.configURI + "Commands/XML/Crea XML de imágenes.xml");

		//Asignamos el valor de la variable del path para listar las imágenes y el nombre del fichero xml
		this.sDirPath = this.oCfg.sDirPath;
		this.sNameFile = this.oCfg.sNameFile;
	}
	else
	{
		alert("Debes tener un documento abierto.");
	}
}

//Comprobación de la respuesta del usuario sobre la ventana de introducción de datos
if ((this.oCfg) &#038;&#038; (this.oCfg.dismiss == "accept"))
{
	this.init();
}
else
{
	//El usuario ha cancelado la operación
}

/**
 * @method	init
 * Método encargado de la inicialización del comando
 * @return	Void
 */
function init()
{
	if(this.sDirPath != "")
	{
		//Obtenemos la ruta del fichero XML y el contenido del fichero XML.
		var sXmlPath = this.getUrlXmlFile();
		var sXmlContent = this.getContentXml();

		//Creamos el fichero e informamos al usuario el resultado de la operación.
		var bSuccess = FLfile.write(sXmlPath, sXmlContent);
		if(bSuccess)
		{
			alert("Se ha creado correctamente el fichero:\n " + sXmlPath);
		}
		else
		{
			alert("No se ha podido crear el fichero:\n " + sXmlPath);
		}
	}
	else
	{
		alert("Debes seleccionar un directorio.");
	}
}

/**
 * @method	getUrlXmlFile
 * Método encargado de obtener la ruta del fichero XML que se generará, lo hace a partir del path del documento y realiza las conversiones pertinentes.
 * @return	String	Cadena con la ruta del fichero XML que se generará.
 */
function getUrlXmlFile()
{
	var ret = "";

	//A partir del path del documento abierto componemos la ruta del fichero XML que será hermano del documento abierto.
	var aTmp = this.oDoc.path.split("\\");
	aTmp.pop();
	var sUnidad = aTmp.shift();
	var aTmp2 = sUnidad.split(":");
	sUnidad = aTmp2.shift();
	ret = "file:///" + sUnidad + "|" + aTmp.join("/") + "/" + this.sNameFile;

	return ret;
}

/**
 * @method	getContentXml
 * Método encargado de obtener el contenido del XML, lo hace a través de listar el directorio configurado, filtrando por tipo de fichero jpg.
 * @return	String	Cadena con el contenido del fichero XML que se generará.
 */
function getContentXml()
{
	var ret = '';

	var aListFiles = FLfile.listFolder(this.sDirPath + "/*.jpg", "files");

	ret += '<?xml version="1.0" encoding="utf-8" ?>\n';
	ret += '<data>\n';
	var nTotal = aListFiles.length;
	for (var i = 0; i < nTotal; i++)
	{
		ret += '\t<imagen src="' + aListFiles[i] + '"/>\n';
	}

	ret += '</data>\n';

	return ret;
}</pre>
<p><strong>Fichero XML</strong> para la interfaz gráfica de nombre Crea XML de imágenes.xml</p>
<pre lang="xml"><dialog title="Crea XML de imágenes"  >
	<flash src="../SWF/Crea XML de imágenes.swf" width="370"   height="230"  id="settings" />
<property id="sDirPath" value=""/>
<property id="sNameFile" value=""/>
</dialog></pre>
<p><strong>Código de la película SWF</strong> de la interfaz gráfica de nombre Crea XML de imágenes.swf</p>
<pre lang="actionscript">import mx.utils.Delegate;

//Asignamos el Foco al botón Aceptar
Selection.setFocus(this.aceptarBTN);
//Asignamos el Tema de color Azul
_global.style.setStyle("themeColor", "haloBlue");

this.browsePathBTN.onRelease = Delegate.create(this, onClickBrowserPath);
this.aceptarBTN.addEventListener("click", this);
this.cancelarBTN.addEventListener("click", this);

/**
 * @method	onClickBrowserPath
 * Método encargado de abrir el cuadro de diálogo de selección de directorio.
 * @return	Void
 */
function onClickBrowserPath():Void
{
	var jsflCode:String = "fl.browseForFolderURL('Selecciona el directorio que deseas listar.');";
	var sDirPath:String = MMExecute(jsflCode);
	pathImagenesTI.text = (sDirPath == "null") ? pathImagenesTI.text : sDirPath;

	jsflCode = "fl.xmlui.set('sDirPath', '" + sDirPath + "');";
	MMExecute(jsflCode);
}

/**
 * @method	click
 * Método encargado de ejecutar las acciones para aceptar el comando y asignar el valor a la variable sDirPath.
 * @param	_oEvent		Object		Objeto de configuración asociada al evento click del botón.
 * @return	Void
 */
function click(_oEvent:Object):Void
{
	switch(_oEvent.target._name)
	{
		case "aceptarBTN":
			onClickAceptar(_oEvent);
			break;

		case "cancelarBTN":
			onClickCancelar(_oEvent);
			break;
	}
}

/**
 * @method	onClickAceptar
 * Método encargado de ejecutar las acciones para aceptar el comando y asignar el valor a la variable sDirPath.
 * @param	_oEvent		Object		Objeto de configuración asociada al evento click del botón.
 * @return	Void
 */
function onClickAceptar(_oEvent:Object):Void
{
	var jsflCode:String = "fl.xmlui.set('sDirPath', '" + _oEvent.target._parent.pathImagenesTI.text + "');";
	MMExecute(jsflCode);

	jsflCode = "fl.xmlui.set('sNameFile', '" + _oEvent.target._parent.nombreFicheroTI.text + "');";
	MMExecute(jsflCode);

	jsflCode = "fl.xmlui.accept();";
	MMExecute(jsflCode);
}

/**
 * @method	onClickCancelar
 * Método encargado de ejecutar las acciones para cerrar la ventana del comando.
 * @param	_oEvent		Object		Objeto de configuración asociada al evento click del botón.
 * @return	Void
 */
function onClickCancelar(_oEvent:Object):Void
{
	var jsflCode:String = "fl.xmlui.cancel();";
	MMExecute(jsflCode);
}</pre>
<p>Los ficheros de este tutorial los pueden descargar de <a href="../../../../../tutoriales/jsfl/Tutorial_JSFL_Comando_con_interfaz_grafica_II.zip">aquí</a>.<br />
Para cualquier duda, sugerencia o comentario aquí estaré atento a vuestros comentarios.</p>
<p>Saludos!!!</p>
<p>Entradas relacionadas:</p>
<ul>
<li><a title="Permanent Link: Recursos JSFL" href="../../../../../2008/08/24/recursos-jsfl/">Recursos JSFL</a></li>
<li><a title="Permanent Link: Tutorial JSFL, Introducción a comandos" href="../../../../../2008/09/26/tutorial-jsfl-introduccion-a-comando/">Tutorial JSFL &#8211; Introducción a comandos</a></li>
<li><a title="Permanent Link: Tutorial JSFL - Comandos con interfaz gráfica" href="../../../../../2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/">Tutorial JSFL &#8211; Comandos con interfaz gráfica</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2008/11/09/tutorial-jsfl-comandos-con-interfaz-grafica-ii/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

