miércoles, marzo 18, 2009

El modo "hibrido" de Xailer.

No cabe duda que el busca encuentra, y así es mi amigo José Manuel Serrano, de Proser Informática, tengo poco mas de 8 años de conocerle y aunque no es un personaje "público", prefiere mantener un tranquilo anonimato, es uno de los programadores de Clipper /(x)Harbour con mas nivel que conozco.

Básicamente el se dedica a los puntos de venta, desde diseñar gabinetes para montar un TPV (todos los que vende son diseños suyos), diseñar y construir la electrónica de los mismos (los visores digitales que llevan sus equipos los diseña él), la electrónica del TPV, que básicamente por dentro son simples PCs, hasta el SOFTWARE para la terminal.

Siempre trabajando en Clipper, ha buscado y le ha dado la vuelta a las limitaciones que el mismo lenguaje le presentaba bajo los distintos sistemas operativos, su TPV hoy en día sigue siendo uno de los mas vendidos de España, y aun está en MS-DOS, y algún intento ha hecho de pasarlo a Windows.

El caso es que José Manuel, siendo una persona a la que le gusta la investigación, le ENCANTA que de vez en cuanto le deje alguna cosilla "para enredar", como dice él , y siempre me sorprende con algún descubrimiento interesante, y esta vez, me ha dejado sorprendido.

¿ Que descubrió el amigo José Manuel esta vez ?, pues que Xailer puede ser utilizado para compilar programas para consola (MS-DOS) y casi nada, también descubrió que se pueden utilizar todas las herramientas de Xailer (gestor de proyectos, debugger, datasets, motor de informes, etc) en un programa de consola puro y duro y que además, y por si fuera poco, era posible combinar componentes en MS-DOS con componentes Windows y hacer que convivieran una ventana de consola con un formulario de Windows.

Lo sorprendente es como llegó a descubrir esto.... por simple lógica.... el proceso mental lo desconozco, pero según me explicaba, era algo mas o menos así:

El XEdit es un gestor de proyectos para compilar programas (x)Harbour para modo consola, ya sea programas simples, o con interfaz gráfica, como con FiveWin, básicamente el XEdit es el mismo IDE de Xailer sin algunas herramientas, por lo tanto, es de esperar que el IDE de Xailer haga lo mismo que el XEdit.

Si el XEdit tiene un gestor de proyectos y genera programas EXE, luego el IDE de Xailer, al ser algo mas completo, tendría que poder hacer lo mismo.... Pues probemos.... así que metió unos trozos de código en Clipper puro y duro en el IDE de Xailer, compiló y ........ ¡ no pasó nada !.... de regreso a la mesa de dibujo.....

Se había olvidado de linkar la librería de la terminal consola de xHarbour.... la linkó y ¡ ahora sí que funcionó el invento !, tuvo una aplicación corriendo en modo consola, compilada con el IDE de Xailer.

El resto fue seguir investigando el tema de la integración y descubrió que podía llamar también a "ventanas" de Windows desde su programa MS-DOS.

En el Open House de Madrid, me mostró lo que había descubierto y ahora yo se los transmito para todos los usuarios de Xailer, presentes y futuros.

ADVERTENCIA: Usen esta información con reservas, es un trabajo bajo investigación y actualmente en desarrollo, no hemos probado que todo funcione como debe, pero seguimos investigando. No me hago responsable de que algo no funcione ni garantizo que todo un programa Clipper funcione.

Necesitas para empezar la versión 1.9x de Xailer y el (x)Harbour para Xailer que puedes descargar de www.xailer.com. Obviaremos los detalles de la instalación, y pasemos directamente a los hechos.

Debes crear un proyecto nuevo con Xailer, se te pedirá nombre del proyecto, yo aconsejo crear una carpeta exclusiva para este proyecto y guardar el proyecto en la carpeta recién creada, Xailer automáticamente crea un .PRG con el mismo nombre del proyecto, que no está visible en el editor de código fuente, pero si das doble click en el gestor de proyectos lo abrirá en el editor.

Cuando creas un proyecto nuevo, Xailer escribe para tí el módulo de carga, que siempre es algo parecido a esto:

Procedure Main()

Application:cTitle := "demohibrido"
Application:Run()

Return


Xailer asume que siempre vas a tener un formulario Windows como tu módulo principal, pero es posible "desviar" la llamada a un formulario, simplemente escribiendo OTRA función DENTRO DEL MISMO PRG, así que nuestro modulo de carga modificado queda como sigue:

Procedure Main()

Application:cTitle := "demohibrido"
Application:Run()

Return


Function MsDos()

RETURN nil


Al detectar otra función dentro del mismo PRG del módulo de carga, Xailer asumirá que el módulo primero a ejecutar es dicha función, y modificará el código del PROCEDURE MAIN para hacer la llamada a este nuevo código, de tal forma que el MAIN se "automodifica" quedando así:

Procedure Main()

Application:cTitle := "demohibrido"
MsDos()
Application:Run()

Return

Nota como Xailer solo ha incluido la llamada a la función "MsDos()".

Y eso es todo amigos, tu programa Clipper MS-DOS va metido dentro de la función MS-DOS y todo el programa correrá dentro de una ventana MS-DOS, veamos por ejemplo como quedaría un típico menú de Clipper usando esta técnica:

Function MsDos()
LOCAL nDemo := 1
SET COLOR TO W+/B
CLS
@ 0,0 SAY "Demo del modo híbrido de Xailer" COLOR "W+/R"
DO WHILE .T.
@ 5,5 PROMPT "Demo de Get en MsDos"
@ 6,5 PROMPT "Abrir archivo DBF"
@ 7,5 PROMPT "Imprimir informe"
@ 8,5 PROMPT "Salir"
MENU TO ndemo
SAVE SCREEN
DO CASE
CASE ndemo = 1
DoMsDosGet()
CASE nDemo = 2
DoOpenDbf()
CASE nDemo = 3
Informe()
OTHERWISE
EXIT
ENDCASE
RESTORE SCREEN
ENDDO

RETURN nil


Código Clipper puro y duro.

Ahora solo tienes que hacer un par de cambios en el proyecto, así que desde el Menú Principal / Proyecto / Propiedades, selecciona la opción Librerías y agrega la terminal de modo Texto GTWIN.LIB:



Y si quieres utilizar el Debugger de Xailer en este pequeño proyecto, entonces selecciona [x]Harbour y agrega "incluir información del Debugger":



Si deseas usar el Debugger de Xailer, no te olvides de marcar los "puntos de ruptura" en tu código fuente o bien, incluir en el código una llamada a la función AltD() para activar el Debugger.

Y ahora simplemente compila y ejecuta tu programa deberás ver algo como esto:



Hay que notar algunas cosas del ejemplo anterior:

Xailer tiene un comando MENU, por lo tanto, entrará en conflicto con el MENU TO de Clipper, para evitar este conflicto, tuve que poner la definición del comando de Clipper manualmente ANTES de llamar la función, y así evitar conflictos entre el MENU de Xailer y el de Clipper. (ver en el ejemplo anexo).

En la siguiente imagen se muestra el depurador de Xailer trabajando sobre la ventana MS-DOS:



Nota como todas los objetos nativos de Xailer (Application, Printer, AppData y Screen) están visibles y activos, nota también como al ir ejecutando línea por línea el debugger ejecuta las instrucciones en la ventana de MS-DOS, guardando incluso los valores de las variables definidas en tu función (por ejemplo la variable nDemo).

Como mencioné anteriormente, todos los componentes de Xailer están disponibles para este programa, porque lo que es posible por ejemplo utilizar DataSets definidos a mano, no visualmente, y también es posible utilizar Formularios y controles de Xailer mandados llamar desde el programa MS-DOS:



Es recomendable si vas utilizar formularios de Xailer en el modo híbrido que cuando los llames lo hagas como :ShowModal(), de lo contrario el flujo del programa vuelve a la ventana de MS-DOS y el programa continúa ejecutándose dejando abierto el formulario.

Y como están disponibles TODOS los objetos con los que cuenta Xailer para el programa en MS-DOS, entonces puedes utilizar el motor de informes de Xailer, y exportar tus informes directamente a Excel o a PDF:



Como verás las posiblidades de esta técnica pueden ser muy interesantes, he hecho un pequeño demo del modo híbrido que puedes descargar haciendo click aquí, incluye el proyecto para Xailer 1.9x, (de momento con la versión 2.0 no hemos podido hacerlo funcionar), por su puesto el código fuente, y el programa EXE ya compilado con Xailer, por si quieres probarlo y no tienes Xailer a la mano para compilar los fuentes.

Debo insistir, esta técnica ESTA EN PRUEBAS, hasta ahora funcionando bien, pero tenemos que hacer mas pruebas para garantizar que un programa Clipper pueda ser compilado al 100% con Xailer y aprovechar sus ventajas, de momento podría ser una ruta fácil para migrar tus programas a 32 bits y luego ir paulatinamente incluyendo ventajas gráficas.

2 comentarios:

Anónimo dijo...

Buenas.

Se empieza a poner interesante lo de Xailer para mi... Tiene xailer algun comando de impresion al modo del @ say de Clipper que permita rellenar formularios? He mirado toda la ayuda y no he visto nada parecido...

Gracias

Un saludo

Eduardo Martin
España

Unknown dijo...

¿Se podría hacer el ejemplo a la inversa?

Digo de hacer un menu en Windows y abrir alguna ventana en consola...

¿Se puede?

Gracias.

Un Saludo