<?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; Tutoriales</title>
	<atom:link href="http://www.nomeva.com/tag/tutoriales/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; 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>
		<item>
		<title>Tutorial PHP &#8211; Leer ficheros de parte privada</title>
		<link>http://www.nomeva.com/2008/10/25/tutorial-php-leer-ficheros-de-parte-privada/</link>
		<comments>http://www.nomeva.com/2008/10/25/tutorial-php-leer-ficheros-de-parte-privada/#comments</comments>
		<pubDate>Sat, 25 Oct 2008 08:15:49 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=221</guid>
		<description><![CDATA[Hace poco hablaba con mis amigos Álvaro y Joan sobre como cargar contenidos en php que se encuentran en la parte privada de nuestro servidor y les dije que en cuanto tuviera un rato libre escribiría un tutorial, así es que aquí lo tienen. Introducción, por lo general nuestro servidor suele venir con alguna de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="Lego php" src="http://www.nomeva.com/imagenes/lego_php.jpg" alt="" width="200" height="227" /></p>
<p>Hace poco hablaba con mis amigos <a title="Álvaro Granados" href="http://www.alvarogranados.com/" target="_blank">Álvaro</a> y <a title="Joan Garcia Camba" href="http://www.joangarcia.info/" target="_blank">Joan</a> sobre como cargar contenidos en <a title="Php" href="http://www.php.net/" target="_blank">php</a> que se encuentran en la parte <strong>privada</strong> de nuestro servidor y les dije que en cuanto tuviera un rato libre escribiría un tutorial, así es que aquí lo tienen.</p>
<p>Introducción, por lo general nuestro servidor suele venir con alguna de las siguientes carpetas:</p>
<ul>
<li><strong>web</strong></li>
<li><strong>www</strong></li>
<li><strong>httpdocs</strong></li>
</ul>
<p>En estas carpetas es donde se almacena todo el contenido al que el usuario puede acceder mediante <strong>http</strong> (salvo restringirlo mediante un fichero <a title=".htaccess" href="http://www.htaccess-guide.com/" target="_blank">.htaccess</a>).</p>
<p>Supongamos que tenemos un proyecto en el que necesitamos guardar los contenidos en la parte <strong>privada</strong>, es decir, en una carpeta por ejemplo al mismo nivel que nuestra carpeta <strong>pública</strong> (web, www, httpdocs) para así evitar que se acceda a estos contenidos mediante una petición <strong>http</strong>, pero que la aplicación necesitará acceder a estos contenidos. Aquí es donde viene tiene sentido este post, jejeje <img src='http://www.nomeva.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<p>Bueno, para poder acceder a estos contenidos necesitamos contar con tres piezas:</p>
<ul>
<li>La ruta del fichero y el <a title="PHP - basename" href="http://es2.php.net/manual/es/function.basename.php" target="_blank">nombre del fichero</a></li>
<li>Conocer el <a title="Content Type" href="http://en.wikipedia.org/wiki/MIME" target="_blank">content type</a> (MIME)</li>
<li><a title="PHP - filesize" href="http://es2.php.net/filesize" target="_blank">Tamaño del fichero</a></li>
</ul>
<p>La primera la tenemos que conseguir de alguna forma a través de nuestra aplicación, la segunda partirá del tipo de fichero y la tercera la obtenemos a partir de la primera, jejeje.</p>
<p>Ahora si, sin más historias pongo el código de ejemplo que hice para este pequeño tutorial:</p>
<pre class="brush:php">&lt;?php
//Configuramos la tabla de tipo
$tipos = array();
$tipos['xml'] = array("text", "xml");
$tipos['swf'] = array("application", "x-shockwave-flash");
$tipos['pdf'] = array("application", "pdf");
$tipos['ppt'] = array("application", "vnd.ms-powerpoint");
$tipos['doc'] = array("application", "vnd.ms-word");
$tipos['xls'] = array("application", "vnd.ms-excel");
$tipos['zip'] = array("application", "x-zip-compressed");
$tipos['rar'] = array("application", "x-rar-compressed");
$tipos['gif'] = array("image", "gif");
$tipos['png'] = array("image", "png");
$tipos['jpg'] = array("image", "jpg");
$tipos['flv'] = array("video", "x-flv");

//Definimos la ruta base de los ficheros
$ruta_base_fichero = "../contenidos/fichero_";

//Recogemos el tipo de fichero que nos solicitan
$tipo_fichero = $_GET['fichero'];

//Obtenemos la ruta del fichero combinando la rutaBaseFichero y el tipo_fichero
$ruta_fichero = $ruta_base_fichero . $tipo_fichero . "." . $tipo_fichero;

//Verificamos que el fichero exista, en caso contrario interrumpimos la ejecucion del proceso.
if(!file_exists($ruta_fichero)) die("El fichero solicitado no existe.");

//Obtenemos el tamanyo del fichero
$tamano_fichero = @filesize($ruta_fichero);

//Indicamos en la cabecera el tipo de fichero, para esto utilizamos la tabla de tipos que creamos en la parte superior
header("Content-Type:" . $tipos[$tipo_fichero][0] . "/" . $tipos[$tipo_fichero][1]);

//Indicamos en la cabecera el nombre del fichero, para esto utilizamos la variable $ruta_fichero, esto es para que el navegador entienda que el fichero no es contenidos.php sino el fichero solicitado
header("Content-Disposition: inline; filename=\"" . rawurlencode(basename($ruta_fichero)) . "\"");

//Indicamos en la cabecera el tamanyo del fichero
header("Content-Length:" . $tamano_fichero);
header("Accept-Ranges:" . $tamano_fichero);
@readfile($ruta_fichero);
?&gt;</pre>
<p>El código está comentado, casi línea a línea, para que quede más claro. Puede optimizarse muchísimo el código, se pueden encapsular constantes, crear clases para reutilizarlo y muchísimas más cosas, pero el fin de este ejemplo es que sirva para iniciarse y entender como consumir contenidos en php de la parte privada de nuestro sevidor.</p>
<p>A continuación los ejemplos:</p>
<ul>
<li><a title="Fichero xml" href="http://www.nomeva.com/contenidos.php?fichero=xml" target="_blank">Fichero xml</a>.</li>
<li><a title="Fichero swf" href="http://www.nomeva.com/contenidos.php?fichero=swf" target="_blank">Fichero swf</a>.</li>
<li><a title="Fichero pdf" href="http://www.nomeva.com/contenidos.php?fichero=pdf" target="_blank">Fichero pdf</a>.</li>
<li><a title="Fichero ppt" href="http://www.nomeva.com/contenidos.php?fichero=ppt" target="_blank">Fichero ppt</a>.</li>
<li><a title="Fichero doc" href="http://www.nomeva.com/contenidos.php?fichero=doc" target="_blank">Fichero doc</a>.</li>
<li><a title="Fichero xls" href="http://www.nomeva.com/contenidos.php?fichero=xls" target="_blank">Fichero xls</a>.</li>
<li><a title="Fichero zip" href="http://www.nomeva.com/contenidos.php?fichero=zip" target="_blank">Fichero zip</a>.</li>
<li><a title="Fichero rar" href="http://www.nomeva.com/contenidos.php?fichero=rar" target="_blank">Fichero rar</a>.</li>
<li><a title="Fichero gif" href="http://www.nomeva.com/contenidos.php?fichero=gif" target="_blank">Fichero gif</a>.</li>
<li><a title="Fichero png" href="http://www.nomeva.com/contenidos.php?fichero=png" target="_blank">Fichero png</a>.</li>
<li><a title="Fichero jpg" href="http://www.nomeva.com/contenidos.php?fichero=jpg" target="_blank">Fichero jpg</a>.</li>
<li>Fichero flv, jejeje, este no lo subí <img src='http://www.nomeva.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</li>
</ul>
<p>Todos los ficheros están en la parte <strong>privada</strong> de mi <strong>servidor</strong>, por tanto desde <strong>http</strong> no se puede acceder a ellos, de tal forma que para acceder a ellos se pasa por un <strong><em>router</em></strong> que es un fichero php que puede acceder a los ficheros y devolverlos.</p>
<p>Un beneficio muy importante que obtenemos al hacer uso de esta metodología es que podemos almacenar en un fichero de <strong>log</strong> o en <strong>base de datos</strong> todas las peticiones que se hagan y así tener más controlado el acceso a estos ficheros, pero bueno este tema da para otro post así que lo dejamos de momento aquí <img src='http://www.nomeva.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p>Espero haberme explicado claramente, si tienen cualquier duda para eso están los comentarios. Ojalá les sea de utilidad. Saludos!!!</p>
<h3>Artículos relacionados:</h3>
<ul>
<li><a title="Leer información de ficheros SWF" href="http://www.nomeva.com/2008/09/22/php-read-file-swf-leer-fichero-swf/" target="_blank">Leer información de ficheros <strong>SWF</strong></a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2008/10/25/tutorial-php-leer-ficheros-de-parte-privada/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL &#8211; Comandos con interfaz gráfica</title>
		<link>http://www.nomeva.com/2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/</link>
		<comments>http://www.nomeva.com/2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 16:03:57 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=187</guid>
		<description><![CDATA[Ahora veremos la segunda parte de los tutoriales de introducción a JSFL. En esta ocasión vamos a introducirnos en el tema de los comandos asistidos con interfaz gráfica. Los comandos como vimos en la primera parte del tutorial son ficheros de texto plano con extensión JSFL que alojamos en nuestro equipo y que podemos ejecutarlos [...]]]></description>
			<content:encoded><![CDATA[<div align="center"><img class="aligncenter" title="Renombra Items v2" src="http://www.nomeva.com/imagenes/lego_renombra_items_v2.jpg" alt="" width="308" height="188" /></div>
<p style="text-align: justify;">Ahora veremos la segunda parte de los tutoriales de introducción a JSFL. En esta ocasión vamos a introducirnos en el tema de los comandos asistidos con interfaz gráfica.</p>
<p style="text-align: justify;">Los comandos como vimos en la <a title="Tutorial JSFL - Introducción a comandos" href="http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/" target="_blank">primera parte</a> del tutorial son ficheros de texto plano con extensión JSFL que alojamos en nuestro equipo y que podemos ejecutarlos desde la opción comandos en la botonera principal del IDE de Flash. Pues bien, en el primer ejemplo requeríamos de la intervención del usuario para indicarnos que nombre se le iba a dar a los elementos seleccionados en la biblioteca, esto lo solucionamos con la función <strong>prompt</strong> de JavaScript, pero si queremos dotar de mayor inteligencia al comando se nos queda corto con el prompt o podría ser muy complejo su uso, ahí es donde entran en juego las interfaces.</p>
<p style="text-align: justify;">Añadir una interfaz a un comando</p>
<p style="text-align: justify;">Para esta tarea debemos utilizar <a title="XML2UI" href="http://sourceforge.net/projects/xml2ui" target="_blank">XML2UI</a> que al fin y al cambo es un fichero XML que sigue el estándar <a title="XUL" href="http://www.mozilla.org/projects/xul/" target="_blank">XUL</a>, para más información mirar este <a title="X-Flash: JSFL: Javascript Flash 3" href="http://www.x-flash.org/as/docs/extensibilidad3.htm" target="_blank">post</a>, porque el tema da para escribir mas de un post.</p>
<p style="text-align: justify;">En nuestro caso vamos a añadir más funcionalidad a nuestro comando, permitiendo añadir un prefijo y/o un sufijo al nombre de los elementos seleccionados. Para esto crearemos el siguiente XML que nos ayudará a crear la interfaz gráfica de usuario.</p>
<p style="text-align: justify;">
<pre lang="xml"><dialog title="Renombra Items v2" buttons="accept, cancel">
<vbox>
	<label value="Introduzca los valores para modificar los elementos"/>
	<separator/>
	<hbox>
		<label value="Prefijo"/>
		<textbox id="sPrefijo" size="10" maxlength="10" />
		<separator/>
		<label value="Nuevo nombre"/>
		<textbox id="sNuevoNombre" size="10" maxlength="10" />
		<separator/>
		<label value="Sufijo"/>
		<textbox id="sSufijo" size="10" maxlength="10" />
	</hbox>
	<separator/>
</vbox>
</dialog></pre>
<p style="text-align: justify;">Para obtener la siguiente interfaz gráfica:</p>
<div align="center"><img class="aligncenter" title="Renombra Items v2" src="http://www.nomeva.com/imagenes/renombra_items_v2.jpg" alt="" width="414" height="147" /></div>
<p style="text-align: justify;">Con esto podremos obtener en una sola ventana hasta 3 valores que nos servirán para renombrar los items seleccionados en la biblioteca.</p>
<p style="text-align: justify;">En la definición de nuestro XML hemos declarado 3 cajas de texto, para poder acceder al valor de estas cajas de texto nos hace falta diferenciarlas de alguna forma, para esto les asignamos un identificador en el campo <strong>id</strong> tal como lo hariamos en <strong>JavaScript</strong> o en <strong>Flex</strong> en los ficheros <strong>MXML</strong>.</p>
<pre lang="xml"><textbox id="sPrefijo" size="10" maxlength="10" />
<textbox id="sNuevoNombre" size="10" maxlength="10" />
<textbox id="sSufijo" size="10" maxlength="10" /></pre>
<p style="text-align: justify;">Ahora debemos modificar un poco el fichero JSFL, pues tenemos que indicarle que utilice el fichero XML que hemos creado como interfaz gráfica, para esta tarea debemos añadir el siguiente código:</p>
<p style="text-align: justify;">
<pre lang="javascript">var oCfg = fl.getDocumentDOM().xmlPanel(fl.configURI + "Commands/XML/Renombra Items v2.xml");</pre>
<p style="text-align: justify;">Como vemos asignamos el resultado del método xmlPanel a una variable, esto es porque a través de esta variable tendremos acceso a los valores que haya introducido el usuario en la interfaz gráfica, por ejemplo para nuestro caso:</p>
<p style="text-align: justify;">
<pre lang="javascript">oCfg.sPrefijo;
oCfg.sNuevoNombre;
oCfg.sSufijo;</pre>
<p style="text-align: justify;">Lo siguiente que tenemos que hacer es una comprobación para verificar que el usuario ha introducido por lo menos un valor en la ventana y así proceder a realizar el cambio de nombres, la comprobación la realizamos de la siguiente manera:</p>
<p style="text-align: justify;">
<pre lang="javascript">if( oCfg.sPrefijo != "" || oCfg.sNuevoNombre != "" || oCfg.sSufijo != "" )
{
	//Bien, podemos seguir adelante
}
else
{
	alert("Es necesario rellenar por lo menos uno de los tres campos para renombrar los elementos.");
}</pre>
<p style="text-align: justify;">Perdonad, se me ha olvidado una parte súper importante, la respuesta de usuario, pues existe la posibilidad de cerrar la ventana y no querer renombrar los elementos, esto lo podemos verificar de la siguiente forma:</p>
<p style="text-align: justify;">
<pre lang="javascript">if (oCfg.dismiss == "accept")
{
	//Bien, podemos seguir adelante
}
else
{
	//El usuario ha cancelado la operación
}</pre>
<p style="text-align: justify;">Ahora si, una vez que hemos verificado que el usuario acepta la operación y que además ha introducido por lo menos uno de los tres valores, ya nos encontramos en condiciones de realizar el renombre de los items, así que realizamos la siguiente modificación dentro del bucle de los elementos seleccionados:</p>
<p style="text-align: justify;">
<pre lang="javascript">oItem = aItems[i];
sNombreActual = oItem.name.split("/").pop();
sNombre = (this.sNuevoNombre != "") ? this.sNuevoNombre + "_" + (i + 1) : sNombreActual ;
this.oLib.selectItem(oItem.name);
this.oLib.renameItem(this.sPrefijo + sNombre + this.sSufijo);</pre>
<p style="text-align: justify;">Con esto dejamos listo nuestro comando <strong>Renombra Items v2</strong>, <a title="Renombra Items v2" href="http://www.nomeva.com/tutoriales/jsfl/Renombra_items_v2.zip" target="_blank">aquí</a> dejo los archivos de este tutorial, se deben copiar en la ruta de los comandos del sistema.</p>
<p style="text-align: justify;">Saludos y espero que sea de utilidad.</p>
<p style="text-align: justify;">Más información:</p>
<p style="text-align: justify;"><a title="X-Flash: JSFL" href="http://www.x-flash.org/as/docs/extensibilidad1.htm" target="_blank">X-Flash: JSFL</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2008/10/12/tutorial-jsfl-comandos-con-interfaz-grafica/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial JSFL, Introducción a comandos</title>
		<link>http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/</link>
		<comments>http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/#comments</comments>
		<pubDate>Sat, 27 Sep 2008 00:45:27 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=150</guid>
		<description><![CDATA[Este es el primero de una serie de tres tutoriales que pienso escribir sobre JSFL, donde mi intención es mostrar de la manera más sencilla posible el uso de esta herramienta en sus distintas aplicaciones. Para este primer tutorial haremos un comando muy sencillo que únicamente utilizará un fichero de tipo JSFL, su tarea es [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="Tutorial JSFL" src="http://www.nomeva.com/imagenes/tutorial_jsfl_v1.jpg" alt="" width="391" height="268" /></p>
<p>Este es el primero de una serie de tres tutoriales que pienso escribir sobre JSFL, donde mi intención es mostrar de la manera más sencilla posible el uso de esta herramienta en sus distintas aplicaciones.</p>
<p>Para este primer tutorial haremos un comando muy sencillo que únicamente utilizará un fichero de tipo JSFL, su tarea es muy sencilla, renombrará items de la biblioteca. Pero antes quizá deberiamos saber que son y donde se almacenan estos ficheros JSFL.</p>
<p>Pues bien, los ficheros JSFL son ficheros de texto plano con la extensión <em><strong>jsfl </strong></em>que contienen código JSFL y que podemos editar con el block de notas o nuestro editor de código preferido, en mi caso utilizo <a title="Flash Develop" href="http://www.flashdevelop.org/" target="_blank">Flash Develop</a>.</p>
<p>Los ficheros JSFL se almacenan principalmente en la ruta de instalación de Flash y también en nuestro perfil, en mi caso estoy trabajando bajo un Windows XP y la ruta donde tengo mis comandos es la siguiente:</p>
<p><span style="color: #0000ff;"><em>C:\Documents and Settings\Usuario\Configuración local\Datos de programa\Adobe\Flash CS3\es\Configuration\Commands</em></span></p>
<p>Bueno, ahora si nos podemos poner a escribir nuestras primeras líneas de código JSFL.</p>
<pre lang="javascript">//Declaración de variables
var oDoc;
var oLib;</pre>
<p>Hasta ahora todo es muy fácil, ¿no? ni si quiera perece que estemos programando en JSFL, jejeje, pues de eso se trata, vamos con la siguiente parte, la configuración y comprobación principal del documento.</p>
<pre lang="javascript">//Obtenemos las referencias al documento y a la biblioteca
this.oDoc = fl.getDocumentDOM();
if(this.oDoc)
{
    this.oLib = this.oDoc.library;
}
else
{
    alert("Debes tener un documento abierto.");
}</pre>
<p>Aquí empezamos a ver cosas nuevas, por ejemplo <strong><em>fl.getDocumentDOM()</em></strong>, esta expresión nos permite obtener una referencia al documento actual en Flash, en el caso que no se tenga abierto ningún documento no devolvería nada y en la comprobación que hacemos llegariamos a un amigo más conocido, el <em><strong>alert</strong></em> que nos indica que debemos tener un documento abierto. Continuemos, en el caso que si exista el documento obtendriamos la referencia a la biblioteca a través de la propiedad <em><strong>library</strong></em> del documento.</p>
<p>Veamos la siguiente parte:</p>
<pre lang="javascript">//Obtenemos los elementos seleccionados y el total
var aItems = this.oLib.getSelectedItems();
var nTotalItems = aItems.length;
if(nTotalItems &gt; 0)
{
    //...
}
else
{
    alert("Debes seleccionar algún item de la biblioteca.");
}</pre>
<p>Aquí volvemos a ver algo nuevo, la expresión <em><strong>this.oLib.getSelectedItems()</strong></em> es una llamada a un método del objeto library que nos devuelve un array con los items seleccionados en la biblioteca y aquí también hacemos una comprobación para continuar con la correcta ejecución del comando o mostrando una ventana de alerta informando al usuario que debe seleccionar algún item en la biblioteca.</p>
<p>En este momento ya nos encontramos en condiciones de preguntarle al usuario cual será el nuevo nombre que desea dar a los items, para esto no necesitamos realmente JSFL pues lo hacemos con JavaScript:</p>
<pre lang="javascript">//Obtenemos el nuevo nombre
var sNuevoNombre = prompt("Nuevo nombre");</pre>
<p>Y ahora si, ya con todo listo podemos proceder a la parte importante del comando, renombrar los items seleccionados:</p>
<pre lang="javascript">var oItem;
for(var i = 0; i &lt; nTotalItems; i++)
{
    oItem = aItems[i];
    this.oLib.selectItem(oItem.name);
    this.oLib.renameItem(sNuevoNombre + "_" + (i + 1));
}</pre>
<p>Lo que hacemos es crear una varible para almacenar la referencia al item actual, luego creamos un bucle para recorrer los elementos seleccionados, obtenemos la referencia al item actual, utilizamos el método <strong>selectItem</strong> del objeto library para seleccionar un nuevo item, esto es porque para que funcione el método <strong>renameItem</strong> del objeto library es necesario haber seleccionado antes el item que se dese renombrar.</p>
<p>Y listo, con esto tenemos nuestro primer comando funcionando y todo desde un fichero JSFL. Podéis descargar el fichero de ejemplo de <a title="Renombra Items v1" href="http://www.nomeva.com/tutoriales/jsfl/rename_v1.zip" target="_blank">aquí</a>.</p>
<p>Para cualquier duda, sugerencia o comentario estaré encantado en recibirlas y responderlas.</p>
<p>Más información:</p>
<p>Mi <a title="Presentación Talleres Subflash 2008" href="http://www.nomeva.com/recursos/JSFL_para_automatizar_procesos.pdf" target="_blank">presentación</a> para los talleres Subflash 2008.</p>
<p>Lista de <a title="Recursos JSFL" href="http://www.nomeva.com/2008/08/24/recursos-jsfl/" target="_blank">recursos</a> sobre JSFL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2008/09/26/tutorial-jsfl-introduccion-a-comando/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Recursos JSFL</title>
		<link>http://www.nomeva.com/2008/08/24/recursos-jsfl/</link>
		<comments>http://www.nomeva.com/2008/08/24/recursos-jsfl/#comments</comments>
		<pubDate>Sun, 24 Aug 2008 19:58:30 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[JSFL]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Extensiones]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Libros]]></category>
		<category><![CDATA[Paneles]]></category>
		<category><![CDATA[Recursos]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=41</guid>
		<description><![CDATA[En menos de una semana estaré con mis amigos de subflash en los talleres de verano disfrutando de un fin de semana en Alicante, con playita y unas sesiones muy jugosas, una de ellas la impartiré yo y justamente estoy rematando lo últimos detalles de mi presentación, estoy con la parte de recursos y enlaces, [...]]]></description>
			<content:encoded><![CDATA[<p>En menos de una semana estaré con mis amigos de subflash en los <a title="Talleres Subflash 2008" href="http://www.subflash.com/talleres/2008" target="_blank">talleres de verano</a> disfrutando de un fin de semana en Alicante, con playita y unas sesiones muy jugosas, una de ellas la <a title="JSFL para automatizar procesos hacer tu día a día más fácil" href="http://www.nomeva.com/2008/06/09/jsfl-para-automatizar-procesos-hacer-tu-dia-a-dia-mas-facil/" target="_self">impartiré yo</a> y justamente estoy rematando lo últimos detalles de mi presentación, estoy con la parte de recursos y enlaces, así que he vaciado todos mis rss, notas,  TODO list y todo aquello que he ido guardando durante esta incursión que llevo en el mundo de JSFL para poder compartirlo con todo aquel bienaventurado que esté presente durante mi ponencia.</p>
<p>Pero como no quería dejarlo sólo ahí he decidido escribir este post para que así alguién más se beneficie. Así que allá vamos.</p>
<p><strong>Libros</strong></p>
<ul>
<li><a title="Extending Flash CS 3" href="http://livedocs.adobe.com/flash/9.0/main/flash_cs3_extending.pdf " target="_blank">Extending Flash CS 3: Documentación Oficial</a></li>
<li><a title="Extending Flash MX 2004" href="http://www.friendsofed.com/book.html?isbn=1590593049 " target="_blank">Extending Flash MX 2004: Complete Guide and Reference to JavaScript Flash</a></li>
</ul>
<p><strong>Tutoriales</strong></p>
<ul>
<li><a title="x-flash.org JSFL, extensibilidad" href="http://www.x-flash.org/as/docs/extensibilidad1.htm " target="_blank">Tutorial introductorio a jsfl con ejemplos (en español)</a></li>
<li><a title="Artículo en Adobe sobre la API de JSFL File" href="http://www.adobe.com/devnet/flash/articles/jsapi.html" target="_blank">Introducing the JSFL File API (en inglés)<br />
</a></li>
<li><a title="Creación de Paneles" href="http://flex.sys-con.com/node/43530" target="_blank">Tutorial introductorio para la creación de paneles (en inglés)</a></li>
<li><a title="Organizing Library using JSFL" href="http://www.flashadvisor.com/tutorial/Dynamic_Content/Organizing_Library_using_JSFL-43.html" target="_blank">Organizing Library using JSFL (en inglés)</a></li>
<li><a title="Flash Javascript API JSFL" href="http://www.flashadvisor.com/tutorial/Dynamic_Content/Flash_Javascript_API_JSFL-38.html" target="_blank">Tutorial introductorio a jsfl (en inglés)</a></li>
<li><a title="Extending Flash MX 2004: Using History Panel" href="http://www.devx.com/webdev/Article/20824/0/page/1" target="_blank">Extending Flash MX 2004: Using History Panel (en inglés)<br />
</a></li>
<li><a title="Flash Panels - Inspiration, Creation and Implementation" href="http://www.sitepoint.com/article/flash-panels" target="_blank">Flash Panels &#8211; Inspiration, Creation and Implementation (en inglés)</a></li>
</ul>
<p><strong>Presentaciones</strong></p>
<ul>
<li><a title="Extending Macromedia Flash MX 2004 with Flash JavaScript (JSFL)" href="http://mxdu.breezecentral.com/p40559868/" target="_blank">Extending Macromedia Flash MX 2004 with Flash JavaScript (JSFL)</a></li>
</ul>
<p><strong>Paneles</strong></p>
<ul>
<li><a title="Panel para ejecutar, editar y crear scripts JSFL" href="http://www.joangarnet.com/blog/?p=12" target="_blank">Panel para ejecutar, editar y crear scripts JSFL</a></li>
<li><a title="gProject" href="http://www.gskinner.com/products/gProject/about.php" target="_blank">gProject</a> (Panel de Proyectos mucho más potente que el de Flash)</li>
</ul>
<p><strong>Recursos</strong></p>
<ul>
<li><a title="Flash Guru" href="http://www.flashguru.co.uk/category/flash/extensions" target="_blank">flashguru</a></li>
<li><a title="5etdemi" href="http://www.5etdemi.com/blog/archives/category/jsfl/" target="_blank">5etdemi</a></li>
<li><a title="Joan Garnet" href="http://www.joangarnet.com/blog/?cat=11" target="_blank">joangarnet</a></li>
<li><a title="After-Hours" href="http://www.after-hours.org/blog/archives/category/jsfl/" target="_blank">after-hours</a></li>
<li><a title="Dynamic Flash" href="http://dynamicflash.com/jsfl/" target="_blank">dynamicflash</a></li>
</ul>
<p><strong>Extensiones</strong></p>
<ul>
<li><a title="FileSystem API" href="http://www.flashguru.co.uk/jsfl-filesystem-api" target="_blank">FileSystem API</a></li>
<li><a title="Extensiones en 5etdemi" href="http://www.5etdemi.com/blog/archives/2005/01/toolsextensions-for-flash-mx-2004/" target="_blank">Muchas extensiones en 5etdemi</a></li>
</ul>
<p>Espero que les sea de utilidad. Salu2&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2008/08/24/recursos-jsfl/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Aprende Flex en una semana (o menos)</title>
		<link>http://www.nomeva.com/2008/08/05/aprende-flex-en-una-semana-o-menos/</link>
		<comments>http://www.nomeva.com/2008/08/05/aprende-flex-en-una-semana-o-menos/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 10:18:06 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Serge Jespers]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=28</guid>
		<description><![CDATA[Vía Serge Jespers me entero que adobe a  creado una serie de video tutoriales para aprender Flex en una semana, para todos los que tengan vacaciones y un hueco o ganas de aprender Flex es una oportunidad única. Los video vienen acompañados de ejercicios en PDF para practicar y no sólo ser un observador. Me [...]]]></description>
			<content:encoded><![CDATA[<p>Vía <a href="http://www.webkitchen.be/">Serge Jespers</a> me entero que adobe a  creado una serie de video tutoriales para <a title="Aprende Flex en una semana" href="http://www.adobe.com/devnet/flex/videotraining/" target="_blank">aprender Flex en una semana</a>, para todos los que tengan vacaciones y un hueco o ganas de aprender Flex es una oportunidad única. Los video vienen acompañados de ejercicios en PDF para practicar y no sólo ser un observador.</p>
<p>Me gustan mucho los pasos que está dando <a title="Adobe" href="http://www.adobe.com/" target="_blank">adobe</a> para acercar la maravillosa herramienta que es <a title="Flex" href="http://www.adobe.com/es/products/flex/" target="_blank">Flex</a> hasta nosotros, con las conferencias, los libros y ahora los video tutoriales.</p>
<p>Más información:</p>
<p><a title="Learn flex in a week" href="http://www.webkitchen.be/2008/07/29/learn-flex-in-a-week-or-less-for-free/" target="_blank">Serge Jespers</a></p>
<p><a title="Aprende Flex en una semana" href="http://www.adobe.com/devnet/flex/videotraining/" target="_blank">Flex in a week<br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2008/08/05/aprende-flex-en-una-semana-o-menos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sobre control de versiones (CVS)</title>
		<link>http://www.nomeva.com/2008/08/04/sobre-control-de-versiones-cvs/</link>
		<comments>http://www.nomeva.com/2008/08/04/sobre-control-de-versiones-cvs/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 21:34:13 +0000</pubDate>
		<dc:creator>Luis Adrián</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[eBook]]></category>
		<category><![CDATA[Lo que yo sé de]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Zárate]]></category>

		<guid isPermaLink="false">http://www.nomeva.com/?p=23</guid>
		<description><![CDATA[Hoy en día trabajar en el desarrollo y utilizar una herramienta de control de versiones es fundamental para muchísimas cosas, entre ellas el tener nuestros desarrollos respaldados en un servidor, el tener a la mano distintas versiones del mismo y poder dar marcha atrás fácilmente, el poder hacer desarrollos modulares en paralelo, en fin son [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy en día trabajar en el desarrollo y utilizar una herramienta de control de versiones es fundamental para muchísimas cosas, entre ellas el tener nuestros desarrollos respaldados en un servidor, el tener a la mano distintas versiones del mismo y poder dar marcha atrás fácilmente, el poder hacer desarrollos modulares en paralelo, en fin son muchos y variados los motivos que pueden llevar a cada desarrollador a utilizar un sistemas de control de versiones.</p>
<p>Los más populares o (jejeje) con los que he trabajado son <a title="CVS" href="http://es.wikipedia.org/wiki/CVS" target="_blank">CVS</a> y <a title="Subversion" href="http://es.wikipedia.org/wiki/Subversion" target="_blank">SVN</a>, es precisamente este último del que trata este post, porque nuestro incansable y siempre dispuesto a compartir <a title="Zárate" href="http://www.zarate.tv/" target="_blank">Zárate</a> ha escrito otro nuevo <a title="What I know about SVN" href="http://zarate.tv/assets/articles/what-i-know-about-svn/What-I-know-about-SVN.pdf" target="_blank">eBook</a> de la familia de <a title="Lo que yo sé de" href="http://www.loqueyosede.com/" target="_blank">loqueyosede</a>.</p>
<p>El libro está bastante completo y como viene siendo costumbre de Juan, nos cuenta su peculiar punto de vista  dando la chapa donde hace falta. Abarca temas desde la instalación, las acciones básicas de crear repositorios, añadir, actualizar, etcétera.</p>
<p>Enlaces de interés:</p>
<p><a title="Lo que yo sé de" href="http://www.loqueyosede.com/" target="_blank">loqueyosede</a></p>
<p><a title="What I know about SVN" href="http://zarate.tv/assets/articles/what-i-know-about-svn/What-I-know-about-SVN.pdf" target="_blank">LoqueyosédeSVN</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomeva.com/2008/08/04/sobre-control-de-versiones-cvs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

