8 de septiembre de 2013

Documentación de FoxBarcode

FoxBarcode es una clase 100% Visual FoxPro que ofrece una herramienta para la generación de imágenes con distintas simbologías de códigos de barras, para ser usadas en informes y formularios de VFP, o exportadas a otras aplicaciones. Su uso y distribución es libre para toda la Comunidad de Visual FoxPro.

Sitio oficial de FoxBarcode: https://github.com/VFPX/FoxBarCode

Última versión: 1.12 lanzada el 08/09/2013

Sitio de Descarga: https://github.com/VFPX/FoxBarCode

Características

FoxBarcode soporta las siguientes 18 simbologías lineales de códigos de barras: Código 128, Código 39, Código 39 Extendido (Full ASCII), Código 93, Código 93 Extendido (Full ASCII), Standard 2 de 5, Interleaved 2 de 5, EAN-8, EAN-13, UPC-A, UPC-E (EAN y UPC con suplementos de 2 y 5 dígitos), ITF-14, GS1/EAN/UCC-128, Codabar, Código 11, MSI / Plessey, Telepen, PostNet, RM4SCC, KIX-Code, One Track Pharmacode y Two Track Pharmacode.

FoxBarcode soporta los siguientes tipos de imagenes: JPG, BMP, GIF, PNG y TIFF

FoxBarcode genera las imágenes con la clase gpImage2 (http://sites.google.com/site/gpimage2) de Alexander Golovlev (Rusia) y Cesar Ch. (Brasil), basada en GDI+ y requiere gdiplus.dll.

FoxBarcode permite un gran control en la generación de la imagen del código de barras al poder personalizar las siguientes propiedades:
  • nImageHeight: Altura en pixeles de la imagen.
  • nImageWidth: Ancho en pixeles de la imagen. Ahora se puede configurar el ancho
  • nAlignBarcode: Alineación del código de barra con respecto a la imagen. [0=Izquierda, 1=Centro y 2=Derecha]
  • nResolution: Resolución de la imagén en DPI.  
  • nRotation: Rotación de la imagen. [0=0°, 1=90°, 2=180°, 3=270°]
  • cImageType: Tipo de la imagen generada ["JPG", "GIF", "PNG", "BMP", "TIF"]
  • cImageFile: Nombre del archivo de imagen generado. Si no se especifica, se genera un nombre de archivo aleatorio en la carpeta de archivos temporales de Windows.
  • cText: Texto a codificar.
  • nAlignText: Alineación del texto de la lectura humana. [0=Izquierda, 1=Centro, 2=Derecha]
  • lShowHumanReadableText: .T. si se muestra la lectura humana.
  • lShowCheckDigit: .T. si se muestra el dígito de control en la lectura humana.
  • lShowStartStopChars: .T. si se muestra los caracteres de inicio y final en la lectura humana.
  • cFontName: Nombre de la fuente de la lectura humana.
  • lFontBold: .T. si la fuente de la lectura humana es Negrita.
  • lFontItalic: .T. si la fuente de la lectura humana es Cursiva.
  • nFontSize: Tamaño de la letra de la lectura humana. [Recomendado = 8 ó 9]
  • nFontColor: Color de la fuente de la lectura humana. [Recomendado = Negro = RGB(0,0,0)].
  • nBackColor: Color de fondo de la imagen [Recomendado = Blanco = RGB(255,255,255)].
  • nBarsColor: Color de las barras [Recomendado = Negro = RGB(0,0,0)].
  • nBarcodeType: Tipo de la simbología de código de barra. Vea la lista de codigos de barra soportados y su Id.
  • cSet128 Set: Juego del Código 128. ["A", "B", "C" y "*" (Auto)]
  • cSupplementalText: Texto suplementario en códigos EAN y UPC.
  • lAddCheckDigit: .T. si se calcula el dígito de control. En las simbologías en donde el dígito de control es obligatorio, no se tiene en cuenta esta propiedad.
  • nBearerBar: Tipo del marco portante, solo en la simbología ITF-14.  [0=Ninguno, 1=Rectángulo, 2=Superior e inferior]
  • lUseAppId:  .T. para que FoxBarcode interprete en el código GS1/EAN/UCC-128 a los Identificadores de Aplicación (encerrados entre paréntesis).
  • nFactor: Factor de magnificación del código de barras. [1..9]
  • nMargin: Margen alrededor del código de barras. 
  • nRatio: Relación entre las barras angostas y las barras anchas en las simbologías que lo permiten.
  • lDeleteTempFiles: Permite elegir si borra o no la carpeta temporal con las imágenes temporales.
Para la generación de la imagen, solo se debe llamar al método BarcodeImage() que genera la imagen del código de barras y retorna la ruta y nombre de archivo generado.

Ahora se puede validar previamente la cadena a codificar con el método BarcodeTest()

FoxBarcode es compatible con todas las versiones de Visual FoxPro a partir de la versión 6.0

Lenguajes

Gracias a la Comunidad Mundial de VFP, se tradujeron los mensajes de FoxBarcode a los siguientes lenguajes:
  • Inglés
  • Español por VFPEncoding
  • Checo por Martin Krivka
  • Holandés por Koen Piller
  • Alemán por Stefan Wuebbe
  • Indonesio por Samir H.
  • Portugués por Cesar Ch.
  • Turco por Ugur Yilmaz
  • Filipino por Glenn Gevero
  • Francés por Samir H.
  • Serbio por Michael Kopljan
  • Italiano por Roberto Saccomanno
Ejemplos

El siguiente es un ejemplo de código para generar una imagen tipo "PNG" del código de barras "Código 128 C" con una altura de "100" pixeles y un factor de magnificación de "2":
*-- Crear el objeto
loFbc = CREATEOBJECT("FoxBarcode")

*-- Configurar las propiedades
WITH loFBC
  .cImageType = "PNG"
  .nBarcodeType = 110 && Code 128
  .cSet128 = "C" && Set 128 C
  .nImageHeight = 100
  .nFactor = 2
ENDWITH

*-- Generar la imagen 
lcImagen = loFbc.BarcodeImage("123456789012")
Desde la versión 0.11 se agregó un 3er. parámetro al método BarcodeImage() que permite configurar varias propiedades, separadas por comas. El mismo ejemplo de arriba, con el uso del 3er. parámetro.
*-- Creo el objeto
loFbc = CREATEOBJECT("FoxBarcode")
*-- Genero la imagen con sus propiedades
lcImagen = loFbc.BarcodeImage("","",[cText="123456789012", cImageType="PNG", ;
           nBarcodeType=110, cSet128="C", nImageHeight=100, nFactor=2])

La imagen generada se muestra a continuación


Otras imágenes de ejemplo cambiando solo algunas propiedades de la clase FoxBarcode





Ahora FoxBarcode soporta el código EAN/UCC/GS1 128


Para incluir un código de barras en un formulario, se debe insertar un objeto Image. Como la imagen del código de barras no existe en tiempo de diseño, la propiedad Picture tomará el nombre de la imagen cuando se llame al método BarcodeImage(), por ejemplo desde el método Refresh de Formulario, como se muestra en la siguiente figura:



Para incluir un código de barras en un Informe, se debe insertar un objeto Image y configurar la propiedad ControlSource con un llamado al método BarcodeImage() y se recomienda configurar "Scale contents, retain shape" si la imagen difiere de tamaño con el cuadro.



NOTA: Antes de ejecutar el informe y crear el objeto FoxBarcode, se debe declarar la variable como PRIVATE para que ésta tenga alcance en el informe, como se muestra a continuación:
PRIVATE poFbc
poFbc = CREATEOBJECT("FoxBarcode")
...
REPORT FORM MyReport
Distribución

Los únicos archivos necesarios que se deben distribuir para que FoxBarcode funcione correctamente son:
  • FoxBarcode.prg
  • gpImage2.prg
Estos archivos se encuentran en la carpeta \Source incluída en el archivo de la descarga.

Antes de instanciar la clase FoxBarcode, se deben ejecutar las siguientes sentencias:
SET PROCEDURE TO LOCFILE("FoxBarcode.prg"), LOCFILE("gpImage2.prg") ADDITIVE

Demo

En los archivos de la descarga, está incluido un proyecto completo de una aplicación Demo que utiliza FoxBarcode. La siguiente es una captura de pantalla de la aplicación.



La aplicación permite:
  • Configurar todas las propiedades de la clase FoxBarcode y muestrar la imagen generada automáticamente.
  • Copiar al portapapeles la imagen generada.
  • Guardar en un archivo la imagen.
  • Imprimir el código de barras.
  • Ejecutar diversos informes y formularios de ejemplo.
  • Construir un Script con el código en Visual FoxPro.
En la aplicación también se muestra una breve descripción de cada simbología de códigos de barras, según se seleccione en la lista desplegable de las simbologías.

Puede leer mas sobre este demo en: Generando códigos de barras con FoxBarcode



¿Quiénes somos?

VFPEncoding es un grupo de desarrolladores pertenecientes a la Comunidad Hispana de Visual FoxPro que creo FoxBarcode. Los miembros de VFPEncoding son:
  • Guillermo Carrero [QEPD] (Barcelona, España)
  • Luis María Guayán (Tucumán, Argentina)
Agradecimientos
  • A nuestras familias.
  • A Cesar Ch. por sus continuas ideas y colaboraciones con sus clases gpImage2 y FoxyPreviewer.

2 de septiembre de 2013

Cómo evitar el mensaje: No puede salir de Visual FoxPro

Artículo original: How to avoid the Cannot Quit Visual FoxPro message
http://www.ml-consult.co.uk/foxst-07.htm

Autor: Mike Lewis
Traducido por: Esparta Palma

Ha desarrollado su aplicación y la ha enviado a su usario. Todo está bien. Entonces recibe una llamada telefónica. El usuario ha intentado cerrar la aplicación, pero todo lo que ha pasado fué que apareció un mensaje: "No puede salir de Visual FoxPro" o "Cannot Quit Visual FoxPro" (vea figura 1). Por qué la aplicación se encuentra aún en un ciclo de eventos.


Figura 1: El temido Mensaje No puede salir de Visual FoxPro.

En algún lugar de la aplicación, ha puesto un código como el siguiente:

DO MainMenu.MPR
READ EVENTS

Una vez que el programa ha sido puesto en un ciclo de eventos (que es lo que READ EVENTS hace), no podrá cerrar la ventana hasta que salga del ciclo de eventos. Esto lo realiza con el comando CLEAR EVENTS. Normalmente ejecuta CLEAR EVENTS en cualquier momento en que el usuario desea cerrar la aplicación -en el comando "Salir" desde el menú "Archivo por ejemplo.

Pero, ¿ que pasa si el usuario trata de cerrar la aplicación haciendo click en el botón cerrar de la barra de título? O al apagar la máquina windows (con Inicio -> Apagar Equipo) mientras la aplicación continúa ejecutándose? En estos casos, el programa no tiene la oportunidad de ejecutar el CLEAR EVENT. El ciclo de eventos continúa activo, es por ello que el mensaje "No puede salir.." aparece.
Para evitar esto, use el comando ON SHUTDOWN. Éste trabaja de la misma manera que cualquier otro comando "ON", tales como ON ERROR, en los que se especifica una acción a tomar cuando cierto evento ocurre. En este caso, el evento es cualquier intento de cerrar la aplicación, de la modo que fuere.

Así pues, todo lo que tiene que hacer es ejecutar ON SHUTDOWN CLEAR EVENTS. Puede hacerlo cerca del inicio del programa - en cualquier caso antos de READ EVENTS. Una vez que haya hecho esto, el usuario nunca volverá a ver el mensaje "No puede salir..." . Cuando el usuario toca el botón de Cerrar en la barra de título, el programa ejecutará el código de ON SHUTDOWN, el cual hará que se salga del ciclo de eventos y pasa el control a el código que se encuentra después de READ EVENTS. Fin del problema.

No pasa nada

Bueno, no en absoluto. Ahora trate de ejecutar la aplicación en en entorno de desarrollo de VFP. Cierre la aplicación. Entonces trate de salir de Visual FoxPro. Esto no tiene mucha diferencia si utiliza el comando Archivo -> Salir, hacer click en el botón cerrar o escribir QUIT en la Ventana de Comandos. El resultado es el mismo: No pasa nada.

¿Por qué? Debido a que el comando ON SHUTDOWN todavía está en efecto. En vez de cerrer, VFP está ejecutándo únicamente un CLEAR EVENTS, esto no tiene efecto si està en el ambiente de desarrollo y no hay ningun programa corriendo.

Para evitar esto, regrese a su aplicación, y agregue una vez más el comando ON SHUTDOWN. Esta vez, sólo ponga ON SHUTDOWN. Ponga esto en el código de limpieza, esto es, en algún lugar después de READ EVENTS. Su efecto será el de cancelar el primer ON SHUTDOWN.

Este par de comando -- ON SHUTDOWN CLEAR EVENTS y ON SHUTDOWN (sin nada mas) -- son lo mínimo que necesita para cerrar la aplicación con éxito. Pero, dependiendo en cómo la aplicación está estructurada, debería hacer algunas cosas más.

Limpiando

In sus aplicaciones, el comando Archivo -> Salir realiza ciera cantidad de limpieza antes de ejecutar el CLEAR EVENTS. Específicamente, iterar a través de la colección de formularios abiertos (esto es, la colección de Forms en _SCREEN), cerrando cada formulario en turno. Al hacer esto, avisar a el usuario para que trate con las ediciones de datos sin guardar. Hasta este punto, el usuario puede decidir si cancelar el cierre de la aplicación, en cualquier caso la rutina de salida dejará el formulario relevante abierto y regresará para limpiar el ciclo de eventos.

La aplicación necesita necesita ir a través de este mismo procedimiento sin importar cómo el usuario trata de cerrar. Para lograr esto, pondremos lo arriba descrito en un procedimiento, que llamaremos en la llamada de salida. El comando de salida en el menú Archivo llama a éste procedimiento con una simple llamada DO. Y entonces ejecutar el comando ON SHUTDOWN. En otras palabras, en vez de ejecutar ON SHUTDOWN CLEAR EVENTS, ejecutaremos ON SHUTDOW DO FileExit. De este modo, el procedimiento de cerrado es siempre el mismo, sin importar como el usuario lo haya iniciado.