9 de noviembre de 2007

MSBuild, lo nuevo de Delphi 2007 for Win32

Delphi 2007 for Win32 viene ahora con MSBuild para la administración de proyectos. Esta herramienta nos ayudará a simplificar el manejo de grandes proyectos, revitalizando de ésta manera el desarrollo en Win32.

Introducción

Delphi 2007 for Win32 utiliza MSBuild para la administración de proyectos al crear o al actualizar aplicaciones desde versiones anteriores. En nuestro análisis sobre la funcionalidad de MSBuild en nuestros proyectos, migraremos una aplicación muy simple que calcula el dígito verificador de un número NIF tomando como parámetro un número de DNI.

Migrando la aplicación

Bien, para iniciar la migración cargamos Delphi 2007. En el menú File seleccionamos Open Project, notaremos que una nueva ventana de diálogo al estilo Windows Vista nos permite especificar la ubicación del proyecto.


Seleccionamos el archivo NIF.bds y presionamos el botón Abrir. Delphi 2007 for Win32, comienza ahora la migración automática de nuestra aplicación.

Examinando el nuevo Archivo de proyecto (*.dproj )

Una vez que la migración ha terminado, Delphi 2007 ha creado un nuevo archivo con extensión *.dproj.

Este nuevo archivo llamado NIF.dproj es un nuevo formato de archivo de proyecto basado en código XML. Aquí se guardará información referida al proyecto como: la personalidad de Delphi usada al crear la aplicación, información sobre el proyecto, etc. Para comprender su uso es necesario conocer algunos de los elementos básicos del formato de archivo de proyecto de MSBuild que resumo a continuación.

Elementos
Los elementos son entradas en el sistema de generación y se agrupan en colecciones de elementos basadas en los nombres de colección definidos por el usuario. Estas colecciones de elementos se pueden utilizar como parámetros para tareas, las cuales utilizan elementos individuales incluidos en la colección para llevar a cabo los pasos del proceso de generación.

Los elementos se declaran en el archivo de proyecto creando un elemento con el nombre de la colección de elementos como elemento secundario de un elemento ItemGroup. El código siguiente crea una colección de elementos de nombre Compile que incluye dos archivos.

En nuestra aplicación recientemente migrada, el código siguiente crea dos colecciones de elementos con nombres DelphiCompile y DCCReference que incluyen un archivo cada uno respectivamente: NIF.dpr y Unit1.pas.

Propiedades
Las propiedades representan pares clave=valor que se usan para configurar generaciones. Las diferencias entre los elementos y las propiedades son:

  • Los elementos se almacenan en colecciones, mientras que las propiedades contienen un valor escalar único.
  • Los elementos no se pueden quitar de las colecciones de elementos, mientras que se puede modificar el valor de las propiedades una vez definido.
  • Los elementos pueden contener metadatos y utilizar la notación %(ItemMetadata), mientras que las propiedades no pueden.

Las propiedades se declaran creando un elemento con el nombre de la propiedad como elemento secundario de un elemento PropertyGroup. Como ejemplo, el código siguiente crea una propiedad denominada BuildDir con un valor de Build.

A continuación, las propiedades declaradas en el archivo NIF.dproj. Note los tres elementos PropertyGroup y sus respectivas propiedades existentes en el archivo de proyecto.

Note que las configuraciones se representan en los proyectos de MSBuild mediante propiedades agrupadas en un elemento PropertyGroup que contiene un atributo Condition. Delphi 2007 examinará estas condiciones para crear una lista de las configuraciones y plataformas del proyecto que se va a mostrar, por ejemplo

TareasLas tareas son unidades reutilizables de código ejecutable usadas por proyectos de MSBuild para realizar operaciones de generación. Para poner un ejemplo, una tarea podría compilar archivos de entrada o ejecutar una herramienta externa. Una vez creadas, las tareas las pueden compartir y reutilizar desarrolladores diferentes en distintos proyectos.
En el ejemplo, el código mostrado llama a la tarea MakeDir y le envía el valor de la propiedad BuildDir.

Destinos
Los destinos agrupan tareas en un orden particular y exponen secciones del archivo de proyecto como puntos de entrada en el proceso de generación. Los destinos se agrupan a menudo en secciones lógicas para permitir la expansión y aumentar la legibilidad. Dividir los pasos de generación en muchos destinos permite llamar a una parte del proceso de generación desde otros destinos sin necesidad de copiar dicha sección de código en cada destino.

Los destinos se declaran en el archivo de proyecto con el elemento Target. Por ejemplo, en el ejemplo de código siguiente se crea un destino denominado Compile que, a continuación, llama a la tarea Cdc con la colección de elementos declarada en el ejemplo anterior.

Recuerde, la configuración del proyecto que se agrega y modifica mediante Delphi se refleja en el archivo *.dproj, y ésta es generada para cada proyecto.

Probando la aplicación

Regresando al IDE de Delphi 2007 for Win32, veremos que la aplicación ha sido migrada completamente, sin necesidad de intervenir en el proceso. Notaremos también que nuestra aplicación, así como el mismo Delphi, ahora soportan la nueva interfase AERO de Windows Vista. Compilamos el proyecto en Project->Compile NIF.

Y por último ejecutamos la aplicación (presionamos F9). En la ventana de la aplicación digitamos un número de DNI y presionamos Aceptar, el programa mostrará el dígito verificador correspondiente.

Conclusión

Para terminar, el nuevo formato de archivo de proyecto de MSBuild nos permite describir completamente qué elementos se han de generar y cómo han de generarse sobre distintas plataformas y configuraciones. MSBuild utiliza un mecanismo extensible para describir los pasos de una generación. Utilizando MSBuild tenemos en las manos la posibilidad de crear un sistema propio de generación mediante tareas personalizadas escritas en formato XML.

También puedes leer el artículo en: MSBuild, lo nuevo de Delphi 2007 for Win32.

** José Castillo, escribe artículos técnicos sobre Delphi para Danysoft Servicios Profesionales.

3 de noviembre de 2007

Usando Plantillas en Delphi for PHP

Introducción



En el mundo del desarrollo web es muy común crear crear interfaces HTML para nuestras aplicaciones escritas en PHP, el uso de plantillas (templates)nos permite separar el código PHP de su presentación.Delphi for PHP soporta el uso de plantillas, proveyendo de esta manera un diseño único y consistente a su sitio web.

Creando el proyecto



Para crear un nuevo proyecto escogemos, File->New Project->Application.Un proyecto es creado y mostrado en el ProjectManager con un nombre por defecto. Por defecto un archivo unit para el formulario también ha sido creado. Guardamos el proyecto escogiendo File->Save Project Asel cual nos presentará el cuadro de dialogo respectivo. Especificamos el directorio donde se guardaran los archivos del proyecto y digitamos el nombre del proyecto. Presionamos el botón Save. El proyecto ha sido añadido al ProjectManager.



En nuestro ejemplo vamos a crear una simple pagina de Identificación de Usuario (Login) y para eso vamos a colocar en el formulario los siguientes componentes: 1 Label, 1 Edit y 1 Button.

Para hacer esto, basta con seleccionar el componente necesario desde la Paleta de Herramientas y colocarlo sobre el formulario. Diseñamos la página de la siguiente manera:



En el Inspector de Objetos modificamos las propiedades de los componentes de acuerdo al cuadro siguiente:

Componente/Propiedad Name Visible
=============================================
Edit edtName True
Label lbMensaje False
Button btnLogin True

Seleccionamos el botón y en su evento OnClick escribimos el siguiente código PHP:

function btnLoginClick($sender, $params)
{
$this->lbMensaje->Caption = 'Bienvenido '.$this->edtNombre->Text;
$this->lbMensaje->Visible = true;
}

Es importante saber que el nombre que le damos a los componentes se han de utilizar en la plantilla que iremos a usar en el sitio web, como veremos más adelante.



Seleccionamos el formulario haciendo Click sobre el mismo y en el Object Inspector vamos a modificar las siguientes propiedades: TemplateEngine y TemplateFilename.

TemplateFilename, nos permite especificar un archivo .html que nos servirá como plantilla. En este archivo se encuentran especificadas unas “marcas” que hacen referencia al nombre de los componentes que acabamos de crear en el paso anterior. La forma de crear estas marcas en la plantilla .html deben tener la forma {$nombrecomponente}, en nuestro caso serían así: {$lbMensaje}, {$edtNombre} y {$btnLogin} para cada componente respectivamente.

TemplateEngine, nos permite especificar el motor que hará que nuestros componentes se muestren en la posición indicada dentro de nuestra página. Delphi for PHP viene instalado por defecto con un motor llamado Smarty.

Las plantillas que usa Delphi for PHP son del tipo .html, y lo unico que nos queda hacer, es colocar las marcas dentro del código html. Para nuestro ejemplo, cuento con una plantilla de nombre index.html, el mismo que he especificado en la propiedad correspondiente. Cuando trabajamos con plantillas, Delphi for PHP ejecutará el código PHP internamente, y el usuario lo único que verá será una página web basada en plantilla.


Veamos cómo se ve nuestra página cuando la ejecutamos dentro del mismo Delphi for PHP.

Ejecutando la aplicación



Presionamos la tecla F9 para ejecutar la aplicación, y esto es lo que veremos:



Note que la aplicación toma el diseño especificado en la plantilla. A continuación, escribimos el nombre del usuario dentro de la casilla y luego presionamos el botón Aceptar. La aplicación procesará el código PHP especificado en el botón y mostrará un mensaje de bienvenida en la parte superior de la página.



Conclusión


Delphi for PHP es una gran herramienta que evoluciona y lleva al siguiente nivel el desarrollo profesional de aplicaciones web usando PHP.