Creando una estructura de directorios
3 06 2006En muchas ocasiones necesitamos crear una estructura de directorios para organizar los ficheros de nuestras aplicaciones de pocketpc. Por desgracia MDM no nos pone al alcance esa posibilidad en el instalador, pero esto se puede solucionar...
Mediante el uso de un simple XML de configuracion podemos crear nuestra estructura de directorios de forma sencilla al ejecutar por primera vez nuestra aplicacion en el dispositivo móvil y podremos además mover los ficheros que correspondan a sus respectivas carpetas.
En este tutorial exploramos esta técnica y añadimos algunas notas técnicas sobre el trabajo cotidiano con Flash y MDM para el desarrollo de nuestras aplicaciones PPC.
Creación de una estructura de carpetas en nuestros instaladores
Un problema que nos encontramos en muchas ocasiones es el que provoca el hecho de que MDM no nos permita crear una estructura de carpetas en los instaladores que genera (tanto cab como exe). Quizás en muchas ocasiones no sea más que una cuestión de organización, pero en otras es necesario disponer de carpetas para solventar determinados problemas con ficheros. Veamos un ejemplo.
Tenemos una aplicación cuya información es tomada de ficheros xml. Esta aplicación permite instalar varios temas, y el instalador de cada tema ha de ir junto con los xml asociados a dicho tema, aunque la aplicación es la misma. En este caso, si cada instalador lleva un fichero config.xml que tiene información general del tema al que va asociado, si no mantenemos una estructura por carpetas, cuando instalemos un segundo tema nos sobrescribirá el config.xml del anterior tema instalado.
Bien por necesidad, o por orden, veremos como se puede crear una estructura de carpetas de forma automatizada y transparente para el usuario.
Comenzamos
Creamos un fla con las siguientes características:
- Dimensiones: 240 x 320 (tamaño más común para las pocket pc)
- Configurado para exportar para flash player 6.
Contenido:
Para este ejemplo únicamente tendremos un fondo con un texto en él. En nuestro caso hemos llamado al archivo fla estructura, los fps los dejamos en 12 ya que este ejemplo no dispone de ningún tipo de animación y este aspecto no es crítico.
Funciones y métodos que emplearemos
El ejemplo tiene todo su contenido en las funcionalidades mdm{Script} que nos premiten manejar determinados aspectos del sistema de ficheros de nuestro PocketPC. Veamos cuáles emplearemos en este tutorial:
mdmdinit()
La colocamos en el primer frame de nuestra película, sirve para inicializar todo el sistema de funciones y métodos de MDM y que a partir de ese momento podamos emplear nuestro código {mdm}script en nuestro swf. Esta llamada es obligatoria en TODOS los swf empleados en el proyecto y no solamente en el SWF base.
mdm_appdir
Esta variable nos devuelve la ruta completa en nuestro dispositivo móvil a la aplicación que la ha llamado
mdm.makefolder(directorio)
Esta función nos crea el directorio especificado. Es importante tener en cuenta que el directorio debe contener la ruta absoluta de nuestro dispositivo, que se puede construir con el uso de mdm_appdir , como se ve en el siguiente apartado de este mismo tutorial.
mdm.getfilelist_del(directorio, máscara, delimitador, funcion)
Esta función nos permitirá obtener el listado de ficheros del directorio especificado en un String, separando cada fichero por el delimitador que indiquemos como tercer parámetro. La máscara hace alusión al filtrado que podemos establecer a la hora de sacar los ficheros del directorio indicado, aunque en el caso de getfilelist_del, según la documentación de MDM para PPC debe dejarse vacío. La función será el callback que se lanzará cuando se obtenga la respuesta a la petición.
mdm.copyfile(rutaorigen, rutadestino)
Esta función nos permite copiar el fichero indicado en la ruta origen al fichero indicado en la ruta destino. El nombre de fichero en destino puede ser diferente del de origen.
mdm.deletefile(rutafichero)
Esta función nos permite eliminar el fichero indicado en la ruta pasada como parámetro. La usaremos en conjunto con copyfile para simular un movimiento de fichero.
mdm.fileexists(rutafichero)
Esta función nos permite conocer si el fichero indicado en la ruta pasada como parámetro existe. La emplearemos para ver si es la primera vez que se ejecuta la aplicación o no.
mmd.exit()
Esta función nos permitirá cerrar la aplicación lanzada en nuestro PPC, admitiendo determinadas formas para salir con una pregunta, directamente, etc.
Uso del sistema de ficheros de mdm
Para todas las funciones del sistema de ficheros de mdm{Script} y en general todas las funciones propias de MDM que solicitan directorios o ficheros, es muy recomendable obtener la ruta de la aplicación y emplearla en ellas. En caso contrario es posible que fallen y no devuelvan los resultados esperados.
Para obtener el directorio base de nuestra aplicación PPC, se puede emplear la variable de entorno de MDM mdm_appdir , con lo que para emplear una ruta a fichero o directorio en las funciones de MDM debemos concatenarle antes este valor a la ruta relativa al fichero o directorio. Veamos un ejemplo:
-
mdm.makefolder(mdm_appdir+”data”);
Esto nos crearía la carpeta data en el directorio base de nuestra aplicación.
Sin embargo esto no se ha de aplicar cuando las funciones son propias de Action Script, es decir, si queremos cargar un xml que está en la carpeta data de nuestra aplicación, la llamada al mismo en el método load sería la siguiente:
-
miobjetoxml.load(“data/nombrefichero.xml”);
El ejemplo de Estructura de Directorios en el instalador
Antes de comenzar la explicación de cómo crear nuestra estructura de carpetas y colocar los ficheros correspondientes en ellas, vamos a indicar una nota que es aplicable a todos los proyectos con mdm.
Dado que la inicialización de la clase puede llevar un tiempo mayor o menor dependiendo de factores no controlables y relacionados con el dispositivo en el que corre la aplicación, es siempre recomendable crear un sistema de inicialización que nos asegure que cuando queremos acceder a una variable de mdm o a una función, ésta se encuentra disponible.
Para ello podemos o bien dejar un número de fotogramas suficientemente grande (unos 5) entre el primero donde se llama a mdminit, y el primer fotograma donde se empieza a codificar la aplicación, o bien crear un objeto que esté pendiente de la inicialización, y cuando detecte que se ha cargado por completo, nos lance nuestra aplicación.
Veamos un ejemplo de esta segunda opción:
-
// Inicializamos
-
mdminit();
-
//
-
function iniciarAplicacion():Void
-
{
-
_root.gotoAndStop("inicio");
-
}
-
//
-
// Inicializacion con espera hasta
-
// comprobar que la libreria esta cargada
-
// por completo
-
onEnterFrame = function ()
-
{
-
if (_level0.mdm_appdir != undefined)
-
{
-
delete onEnterFrame;
-
iniciarAplicacion();
-
}
-
}
-
stop();
En este ejemplo, el inicio de la aplicación esta en el fotograma etiquetado como “inicio” en la línea de tiempo principal, y este código esta en el primer fotograma de la película.
La idea es muy básica, creamos un enterFrame que comprueba constantemente el valor de mdm_appdir, y cuando detecta que ese valor está ya inicializado quiere decir que la librería está cargada.
Creación del fla de ejemplo
Para este ejemplo dispondremos de 5 capas, una etiquetada como “codigo”, otra como “etiquetas”, otra como “rotulos”, otra como “out” y otra como “boton cerrar. En todas las capas dispondremos de 2 fotogramas. En el segundo fotograma de la capa etiquetas ponemos como label “inicio”.
La capa out contendrá un texto dinámico multilínea de nombre de instancia out que nos servirá para sacar por pantalla los procesos realizados con los archivos.La capa rótulos contiene los textos estáticos de las etiquetas del fla de ejemplo.
En nuestro primer frame de la capa código colocamos el sistema de inicialización comentado en la página anterior.
A continuación como explicamos en los párrafos anteriores, creamos un nuevo fotograma clave en la capa código (el segundo) donde incluiremos el siguiente script:
-
stop();
-
// Comprobamos que existe el fichero config.xml en el directorio
-
// de instalación, lo que quiere decir que es la primera ejecución
-
var ref:MovieClip = this;
-
var existeFichero:Function = function(existe:String)
-
{
-
if (existe == "true")
-
{
-
// llamamos a la creación de directorios
-
ref.cargarEstructuraDirectorios();
-
}
-
else
-
{
-
// No es la primera ejecución
-
ref.out.text += "No es la primera ejecución..."+newline;
-
}
-
}
-
this.cargarEstructuraDirectorios = function()
-
{
-
var ref:MovieClip = this;
-
var xmlTemp:XML = new XML();
-
xmlTemp.ignoreWhite = true;
-
xmlTemp.onLoad = function(exito:Boolean)
-
{
-
if (exito)
-
{
-
ref.crearEstructuraDirectorios(this);
-
}
-
else
-
{
-
this.out.text += "Error al cargar Config.xml..."+newline;
-
}
-
}
-
this.out.text += "Cargando estructura..."+newline;
-
xmlTemp.load("config.xml");
-
}
-
this.crearEstructuraDirectorios = function(xmlTemp:XML)
-
{
-
var i:Number = 0;
-
var j:Number = 0;
-
var dirTemp:XMLNode;
-
var nombreDir:String;
-
var fichero:String;
-
this.out.text += "Creando estructura..."+newline;
-
for (i=0; i<xmlTemp.firstChild.childNodes.length; i++)
-
{
-
dirTemp = xmlTemp.firstChild.childNodes[i];
-
nombreDir = dirTemp.attributes['nombre'];
-
// Creamos el directorio
-
this.out.text += "Creando directorio [ "+nombreDir+" ]"+newline;
-
mdm.makefolder(mdm_appdir+""+nombreDir);
-
// Copiamos sus ficheros a ese directorio
-
for (j=0; j<dirTemp.childNodes.length; j++)
-
{
-
fichero = dirTemp.childNodes[j].attributes['nombre'];
-
this.out.text += "Moviendo fichero [ "+fichero+" ]"+newline;
-
mdm.copyfile(mdm_appdir+""+fichero, mdm_appdir+""+nombreDir+"\\"+fichero);
-
mdm.deletefile(mdm_appdir+""+fichero);
-
}
-
}
-
// Borramos el config
-
mdm.deletefile(mdm_appdir+"config.xml");
-
this.out.text += "FIN DEL PROCESO"+newline;
-
}
-
/// PROGRAMA PRINCIPAL
-
this.out.text = "Comprobando primera ejecucion..."+newline;
-
mdm.fileexists(mdm_appdir+"config.xml",existeFichero);
Finalmente vamos a programar un botón para poder salir de la aplicación cuando deseemos, para ello en el segundo frame de la capa “boton cerrar” situamos un clip de pelicula que represente el cierre de la aplicación (por ejemplo una X, para ser originales). Asignamos a dicho clip cerrar_mc como nombre de instancia y añadimos el siguiente fragmento de código al que ya teníamos insertado en el segundo fotograma de la capa de código.
-
cerrar_mc.onPress = function()
-
{
-
mdm.exit(“ask”,”¿Está seguro de salir?”);
-
}
El significado de este código y el por qué de usar onPress en vez del clásico onRelease se puede conocer en profundidad en el tutorial de este mismo sitio web: detección de conexión .
Creación del ejecutable para PPC
Una vez compilado (y comprobado que no funciona absolutamente nada en nuestro equipo habitual) ya disponemos del swf para crear el ejecutable e instalador de nuestra aplicación para PPC. Si no sabes aun cómo realizarlo te remitimos al tutorial disponible en esta misma web: Uso básico MDM Zinc V2 Pocket PC
Consideraciones finales
Vemos como funciona el sistema de callbacks a la hora de comprobar la existencia de un fichero, hemos de crear una funcion para ejecutarse tras una llamada a un metodo mdm que devuelve un valor. Los valores devueltos por los metodos mdm son generalmente strings, es por ello que la comparación de existe se realiza contra “true” entrecomillado, ya que ha de ser un string.
Una vez que sabemos que es la primera ejecución el resto es básicamente llamar a los métodos de creación de directorios y copia de archivos (y posterior borrado para simular un movimiento de archivos).
Si después de ejecutarla la primera vez miramos la estructura de la carpeta donde se instaló la aplicación veremos como ha cambiado totalmente como indicaba el xml, si ejecutamos una segunda vez veremos por pantalla como detecta que la estructura ya está creada al no localizar el config.xml que se borra cuando la primera ejecución termina correctamente.
Podeís descargaros el paquete del FLA de ejemplo junto el tutorial en PDF en el siguiente enlace:
Descargar Tutorial y archivos Fuente








Comentarios recientes