22 de febrero de 2018

Usa la información de la versión para realizar un seguimiento de los ejecutables

Artículo original: Use version information to keep track of executables
http://www.ml-consult.co.uk/foxst-06.htm

Autor: Mike Lewis (http://www.ml-consult.co.uk)
Traducido por: Ana María Bisbé York


Un usuario está llamando para pedir ayuda. ¿Está seguro que habla de la misma versión?

Si tiene más de una versión compilada de su aplicación, necesita una vía para conocer cuál está utilizando una determinada persona. Visual FoxPro (5.0 y posterior) puede ayudar con esto marcando los ejecutables con el número de la versión e información relacionada.

Para ver cómo funciona esto, abra la aplicación con el Administrador de proyecto, haga clic en Generar, luego Versión. Verá el cuadro de diálogo en el puede introducir el número de la versión, nombre de la organización, descripción del archivo, nombre del producto y otros datos (Vea figura 1). El número de la versión consta de 3 partes: Principal, Secundario y revisión.


Figura 1: Utilice este cuadro de diálogo para especificar la información sobre la versión.

Al generar la aplicación, esta información permanece guardada dentro del archivo EXE. Desde el ejecutable se puede acceder a esa información tanto por el usuario como por el programador.

Lo más interesante es que si selecciona la opción Incrementar automáticamente que aparece en el cuadro de diálogo, el número de versión se incrementará cada vez que sea generado, lo que asegura que será único en su aplicación. (De hecho, es el número de revisión el que será incrementado, si desea cambiar el componente Principal o Secundario, puede hacerlo manualmente.)

De cara al usuario

Entonces, ¿cómo encontrará qué versión está utilizando un usuario determinado? Una opción será que mire en las propiedades del archivo ejecutable. Para ello, ha de localizarlo en el Windows Explorer o una ventana de carpetas, hacer clic derecho sobre el archivo, seleccionar Propiedades y luego seleccionar la ficha Versión. Toda la información que se introdujo desde el Administrador de Proyecto será mostrada. Vea figura 2.


Figura 2: La información de la versión puede obtenerse desde Windows.

Una buena estrategia pudiera ser que la aplicación misma devolviera esta información, y mostrarla en algún sitio que el usuario pueda tomarla fácilmente, algo así como una ventana Acerca de, en el menú Ayuda.

Para recuperar la información de la versión desde su programa, invoque la función AGETFILEVERSION(). Pásele dos parámetros: el nombre de un arreglo para guardar la información, y el nombre de un archivo ejecutable. Como en la mayoría de las funciones “A”, si el arreglo no existe, la función lo creará. Si existe, será re-dimensionado, en caso de necesidad.

Por ejemplo, este comando devuelve información de la versión de un archivo llamado MYAPP.EXE, y la guarda en un arreglo aVer

lnReply = AGETFILEVERSION(aVer,"MYAPP.EXE")

Hay que decir que la función retorna cero si el archivo no contiene información de versión.

Las tres partes del número de la versión se encuentran en el cuarto elemento del arreglo (ver la ayuda de VFP para ver el contenido del resto de los elementos). Este valor es devuelto en formato decimal, con puntos entre los componentes. Es decir, si introdujo 1,2 y 3 en los cuadros de texto mayor, menor y revisión respectivamente, el número que será devuelto será 1.2.3.0 Observe que los 3 componentes han de ser estrictamente numéricos, no podrá especificar 1.2ª, ni podrá hacer distinción entre 1.2 y 1.02

GETFILEVERSION() se introdujo como función nativa de VFP 6.0. En las versiones anteriores, la funcionalidad equivalente se proporcionaba con las FoxTools.

Mike Lewis Consultants Ltd. Abril 1999

18 de febrero de 2018

Clase Barra de desplazamiento con Visual FoxPro

Artículo original: Visual FoxPro ScrollBar Classes
http://www.sweetpotatosoftware.com/blog/index.php/2005/08/27/visual-foxpro-scrollbar-classes/
Autor: Craig Boyd
Traducido por: Ana María Bisbé York


Siento respeto por la creación de barras de desplazamiento (scrollbar).

Temprano en la noche decidí crear una clase scrollbar para utilizarla con Visual FoxPro. Mis necesidades eran: que fuera creada puramente con Visual FoxPro (sin que tuviera ninguna dependencia de controles ActiveX) y que fuera lo suficientemente profesional como para ser utilizada en aplicaciones del mundo real. Han pasado cinco horas ... la clase está completa y ahora siento mis respetos hacia cualquiera que haya sido capaz de crear clases scrollbars. Ha sido uno de los desafíos más difíciles a los que me he enfrentado.

Nueva librería de clases VFPScrollBar

He creado mis clases scrollbar en una librería de clases llamada vfpscrollbar.vcx. Hay que prestar atención a tres clases: scrollbarhorizontal, scrollbarvertical, y sbscrollablecontainer.  Sbscrollablecontainer es un ejemplo de los tipos de clases que se pueden generar utilizando las barras de desplazamiento.

Propiedades y eventos

A continuación, una lista de las propiedades y métodos importantes para scrollbars

Min - Especifica el valor mínimo para la barra (predeterminado es 0)
Max - Especifica el valor máximo para la barra (predeterminado es 100)
Value - Valor actual de la barra basado en la posición de la caja de desplazamiento.
LargeChange - Cantidad que se agrega o deduce del valor de la barra cuando presionamos el área entre la caja de desplazamiento y la flecha de desplazamiento.
SmallChange - Cantidad que se agrega o deduce del valor de la barra cuando se hace clic sobre una flecha de desplazamiento
Change() - Este método de evento se dispara cuando cambia el valor de la barra
Scroll() - Este método de evento se dispara cuando el usuario mueve la caja de desplazamiento.

Al colocar las clases en un contenedor (formulario o lo que sea), puede redimensionar la barra haciéndola más ancha y grande. El resultado en tiempo de diseño puede ser un poco raro (debido a que las flechas de desplazamiento y la caja no se redimensionan o se reponen por sí mismas en tiempo de diseño; pero todo va a tomar forma en tiempo de ejecución. La cuestión aquí es, no necesita perder tiempo en reconfigurar las barras en tiempo de diseño. Colóquelas, redimensiónelas y coloque el contenedor y ejecútelo.

Trabajo futuro y colores

Las barra de desplazamiento actuales son azules (lo que concuerda con los temas de Windows XP); pero mi intención es buscar otros colores de barras para cambiar una propiedad, o verificando el sistema de parámetros del usuario actual, para determinar el color a partir de aquí. He creado meticulosamente estas clases sin utilizar ninguna imagen de forma tal que los colores puedan cambiar fácilmente al vuelo sin recursos de imágenes adicionales.

He revisado además, el código y he arreglado algunas fallas. Lo dejo, tal y como está, estoy exhausto por esto (han sido cinco horas para hacer que esta cosa funcione y que se vea bien). Así que no espere un código clínico con esta clase... quiero decir, no es horrible; pero necesita otro pase para encontrarme a gusto del todo con el.

Son bienvenidas las sugerencias y reporte de errores

Deseo mencionar además que algunos miembros de la Comunidad de Visual FoxPro han comenzado a enviarme sus comentarios, errores corregidos y mejoras de algunos materiales que he publicado en SPS Weblog. Quiero que sepan que esa colaboración, ayuda, comentarios, y/o ideas no sólo son bienvenidas y apreciadas, sino que son exactamente la razón por la cual yo publico aquí estos materiales. No deseo fama ni dinero ... deseo solamente que la  Comunidad de Visual FoxPro mejore el nivel de Visual FoxPro y las otras experiencias de desarrolladores que han trabajado con el, o compañías que puedan considerarlo como una opción viable. Creo que una de las mejores herramientas de desarrollo centrada en datos no merece menos.

He aquí el enlace para descargar el proyecto de ejemplo y el código fuente de vfpscrollbar.vcx así como una imagen de la pantalla de ejemplos que muestra barras utilizadas en una clase contenedor.

Descarga del ejemplo de Scrollbars en VFP y código fuente (46 KB approx.)
http://www.sweetpotatosoftware.com/files/vfpscrollbar.zip

Nota de la traductora: Hasta aquí el escrito original. A continuación detallo las preguntas y observaciones realizadas por Mike y la respuesta de Craig Boyd en la que aclara un grupo de aspectos tenidos, o no, en cuenta.

Mike: Muy bueno como siempre Craig. Se que es un control no terminado, aquí le dejo algunos comentarios:

Mike: 1) La esquina inferior derecha (borde creado por las barras y los bordes del formulario) parecen como si sangraran, es decir, parece ser que son transparentes ¿Es por diseño?

Craig: Si y no. El contenedor desplazable era solo un ejemplo rápido de algo para lo que pudieran ser utilizadas las barras. Sí, Yo pude haber agregado un "gribber" o una forma gris al final derecho del contenedor desplazable; pero existe un aspecto con los colores y los dibujos para temas de Windows XP que el FoxTeam necesita arreglar para Visual FoxPro. Podría ver también a veces un ligero parpadeo en la forma.

Para ilustrar el problema con los controles y temas de Windows XP, desplaza el contenedor hasta que muestres el pageframe que está en el contendor hasta que las fichas queden por debajo de la región no desplazable (donde dice "Visual FoxPro Rocks!". Entonces, si te mueves sobre la mitad inferior de las fichas que son visibles y verás que se dibujan justo sobre el tope de todo y no respeta los bordes del contenedor.

He aquí otro ejemplo para esto ... los gifs animados también van a mostrar a veces este comportamiento.  Puedes posicionarte en el pageframe de tal forma que una ficha quede directamente detrás de las barras y mover el ratón nuevamente sobre la ficha ... o intentar colocando una flecha sobre un encabezado con tema en un grid cualquiera. Básicamente estos controles con temas pintan sobre cualquier cosa cuando se supone que están haciendo su seguimiento de temas. El FoxTeam va a solucionar este problema en el SP 1.

Mike: 2) La rueda del ratón no provoca deplazamiento del contenido.

Craig: Buen punto. Voy a trabajar en esto, a menos que usted tenga algún código que permita a la barra vertical responder a los eventos de la rueda del ratón.

Mike: 3) ¿Pueden desaparecer las barras en caso de no ser necesarias? Por ejemplo, si maximizo el formulario y todo el contenido cabe

Craig: Sí aun no he colocado código para que la barra sea proporcional. Esto, definitivamente será uno de los aspectos a mejorar para la siguiente versión.

Mike: Los desplazamientos parecen muy lentos.

Craig: No he visto eso, se desplazan tan rápido como yo muevo el ratón o hago Clic. ¿Alguien más ha visto esto? Además Mike, puede ejecutar el log de Analizador de trayecto mientras utiliza las barras de desplazamiento y se ven lentas, luego envíemelo o alérteme de dónde es que se atasca. Esto me ayudaría mucho a solucionar el problema. Gracias

Mike: Si pudiera retocar estos aspectos y darle los toques finales a este control, pienso que MS aprendería de el y lo incorporaría (o alguno como este) a Sedna. ¡ Esto es válido para su control separador también ! Continúe con sus grandes contribuciones al mundo VFP .

Craig: Son cuatro puntos muy buenos, y serán muy tenidos en cuenta Mike. Gracias.

14 de febrero de 2018

Gdiplus.vcx y SavetoFile

Artículo original: Gdiplus.vcx and SavetoFile
http://weblogs.foxite.com/vfpimaging/archive/2006/03/24/1338.aspx
Autor: Cesar Ch.
Traducido por: Ana María Bisbé York


¿Ve algo mal en el siguiente código?

LOCAL lcSource, lcDest
lcSource = GETPICT()
lcDest = JUSTPATH(lcSource) + "\_" + JUSTSTEM(lcSource)
LOCAL loImage AS GpImage OF HOME() + ffc\_gdiplus.vcx
loImage = NEWOBJECT("GpImage",HOME()+"ffc\_gdiplus.vcx")
loImage.CreateFromFile(lcSource)
loImage.SaveToFile(lcDest + ".png","Image/png")

Es un código muy sencillo, que se supone que cargue una imagen y la guarde en un PNG. ¡Pero no ocurre nada ! ¿Puede adivinar por qué?

El método SaveToFile de la clase GpImage de _gdiplus.vcx debe recibir un segundo parámetro, tal y como es requerido, el "tvCLSIDEncoder", que puede ser el CLSID del código a emplear, o un tipo MIME, por ejemplo "image/jpeg" o "image/png". Si se especifica un tipo MIME, entonces, el método se muestra dinámicamente el CLSID del código apropiado.

El 99% de nosotros pasa el tipo MIME, debido a que es fácil de recordar; pero  ¡ TENGA CUIDADO ! Porque el parámetro tipo MIME  distingue entre mayúsculas y minúsculas.

¡ Tiene que pasar este parámetro siempre en letras minúsculas !

El código mostrado antes, no funcionaba porque había escrito "Image/png" en lugar de "image/png"

Vaya, ¡ he perdido tanto tiempo en eso !

*()&)(*)%@&$(@&!)@*(_*(&!_()&*_)(&*+_*()

A propósito, los tipo MIME ( Multipurpose Internet Mail Extensions) de los códigos generados dentro de Microsoft Windows GDI+ son los siguientes:

image/bmp 
image/jpeg 
image/gif 
image/tiff 
image/png 

8 de febrero de 2018

Conocer la estructura de una entidad remota usando ADO

Una forma de obtener la misma funcionalidad de SQLColumns, pero a traves de OLEDB/ADO.

Usando las funciones SQLColumns() y SQLTables() podemos obtener esos datos, pero si no fuera posible hacerlo via ODBC (y por lo tanto hacerlo con dicha función), puedes optar por hacerlo con ADO/OLEDB.

#Define adSchemaCatalogs 1
#Define adSchemaColumns 4
#Define adSchemaTables 20

Local oConn As 'ADODB.Connection'
oConn = Createobject('ADODB.Connection')
oConn.Open( "Provider=sqloledb;Data Source=(local);"+;
  "Initial Catalog=Pubs;Integrated Security=SSPI" )
rstSchema = oConn.OpenSchema(adSchemaColumns)
ShowMe(rstSchema)
rstSchema.Close
oConn.Close

Function ShowMe
  Lparameters toRecordset
  oForm = Createobject('myForm', toRecordset)
  oForm.Show
  Read Events
Endfunc

Define Class myform As Form
  Height = 450
  Width = 750
  Name = "Form1"

  Add Object hflex As OleControl With ;
    Top = 10, Left = 10, Height = 430, Width = 730, Name = "Hflex", ;
    OleClass = 'MSHierarchicalFlexGridLib.MSHFlexGrid'

  Procedure Init
    Lparameters toRecordset
    This.Caption = "Recordset"
    This.hflex.Datasource = toRecordset
    This.hflex.AllowUSerResizing = 3
  Endproc
  Procedure QueryUnload
    Clear Events
  Endproc
Enddefine

Çetin Basöz
MS Foxpro MVP, MCP

3 de febrero de 2018

Lograr el aspecto cristalino de Vista con Visual FoxPro

Artículo original: Vista’s Aero Glass for Visual FoxPro
http://www.sweetpotatosoftware.com/blog/index.php/2006/10/14/vista-s-aero-glass-for-visual-foxpro/
Autor: Craig Boyd
Traducido por: Ana María Bisbé York


El efecto cristalino

Hubo una pequeña tertulia sobre los formularios transparentes la primera vez que aparecieron, ahora ha alcanzado mayor relevancia con los efectos que brinda Windows vista. En mi opinión, el efecto de apariencia cristalina es el elemento de presentación que marcará a cualquier aplicación como una aplicación que comience a correr en Windows Vista. Por tanto, no es de sorprenderse que muchos desarrolladores están buscando las vías para reproducir un aspecto similar en sus aplicaciones. Bernard Bout tiene algunos ejemplos realmente muy buenos sobre esto en su blog. Con muy buen ojo para el diseño, una pequeña ayuda de Cesar Ch. y GDI+, y teniendo como guía el efecto cristalino de Windows Vista, Bernard me ha impresionado (como consecuencia, lo he agregado a mi lista del Blog). Por favor, vea las siguientes entrada de su blog para que vea sobre qué es de lo que estoy hablando.

Sobre Visual FoxPro en Vista

Crear una aplicación Visual FoxPro que tenga algún efecto Aero Glass es más que suficiente. Los formularios de nivel superior (ShowWindow = 2) están limitados automáticamente (barra de título, caja de controles y bordes) en Aero Glass. Es siempre algo bueno cuando los desarrolladores Visual FoxPro no tienen que saltar hacia lo más novedoso como las golosinas que ofrece Microsoft en un sistema operativo (¿Recuerdan cuando se agregó que VFP soportara los temas?). Esto es especialmente verdadero en este caso porque la alternativa no es muy bonita (vea la imagen debajo de un formulario VFP con ShowWindows = 0 ó 1).

Ha oído sobre esto antes

He oído que muchos de ustedes leyendo esto están pensando, "Craig, usted y los otros han mostrado los efectos cristalinos para formularios Visual FoxPro que se ejecutan en Windows Vista. No hay nada más aquí!". Sin embargo, lo que probablemente no ha visto (no estoy seguro de que se haya hecho antes) es el efecto Aero Glass en el área del cliente (área de superficie) de un formulario VFP y ESO, es lo que voy a mostrar cómo se hace. Vea la siguiente imagen para que vea un ejemplo de lo que estoy diciendo.

¿Cómo está hecho?

Para lograr esto empleé la función DwmExtendFrameIntoClientArea que viene en Desktop Window Manager API (dwmapi.dll) en Windows Vista.

La firma de esta función está declarada como sigue en MSDN:

HRESULT DwmExtendFrameIntoClientArea(
HWND hWnd,
const MARGINS *pMarInset
);

Y la estructura MARGINS (vea el parámetro pMarInset en el código debajo) está definido como sigue:

typedef struct _MARGINS{
int cxLeftWidth;
int cxRightWidth;
int cyTopHeight;
int cyBottomHeight;
} MARGINS, *PMARGINS

Que yo traduje en la siguiente declaración y código que agregué al Init() de un formulario de nivel superior en Visual FoxPro 9.0 que corre en Windows Vista.

DECLARE LONG DwmExtendFrameIntoClientArea IN dwmapi.dll Long hwnd, string @ pMarInset

LOCAL lnHwnd, lcMargin, lnGlassLeft, lnGlassRight, lnGlassTop, lnGlassBottom

m.lnHwnd = this.HWnd
m.lnGlassLeft = 50
m.lnGlassRight = 50
m.lnGlassTop = 50
m.lnGlassBottom = 50
m.lcMargin = BINTOC(m.lnGlassLeft, '4RS') ;
           + BINTOC(m.lnGlassRight, '4RS') ;
           + BINTOC(m.lnGlassTop, '4RS') ;
           + BINTOC(m.lnGlassBottom, '4RS')

DwmExtendFrameIntoClientArea(m.lnHwnd, @m.lcMargin)

Este código no tuvo ningún efecto en mi formulario de nivel superior, así que supe que aún estaba olvidando una pieza de mi rompecabezas. La respuesta vino de un artículo de Code Project. Se ve para la función DwmExtendFrameIntoClientArea que trabaje su magia en píxeles que son cambiados como parte del frame Aero Glass pueden hacer que el canal Alpha sea 0. Y con este artículo descubrí la vía más sencilla para pintar esos píxeles negros.

Entonces, lo que hice fue, en lugar de hacer un gancho a los mensajes de Windows y utilizar GDI+ para hacer esto (que hubiera podido) utilicé algunas formas VFP con su propiedad BackColor como RGB(0,0,0). Coloqué cuatro de estas formas alrededor de los lados del formulario y les arreglé su altura y ancho (dependiendo de dónde fueran colocadas). Empasté los valores que había asignado a m.lnGlassLeft, m.lnGlassRight, m.lnGlassTop, y m.lnGlassBottom (vea el código debajo donde yo imito una estructura MARGINS (márgenes). Una vez que hice esto, el formulario se vio como se muestra en la imagen en el diseñador de formularios de VFP. Y, cuando lo ejecuté, voila' - ¡ ya tengo el efecto Aero Glass en el área de cliente de un formulario VFP!

¿Y esto para qué es bueno?

Hay muy buenos ejemplos de Interfaz de usuario que han sido diseñadas utilizando esta técnica. Puede ver algunas de ellas si visita el artículo de Code Project que he indicado antes en esta entrada de blog. En pocas palabras, esto es bueno para la creación de magníficas interfaces de usuario para aplicaciones Visual FoxPro.

Un buen uso podría ser crear áreas de barra de estado en formularios de nivel superior que incluyan una barra de progreso y otros controles. La imagen que está debajo es solamente un ejemplo de cómo suena esto en un formulario VFP. Emplea el mismo código que he mostrado arriba excepto que solamente fijo lnGlassBottom en 50 (todo el resto fue 0) y solamente he utilizado la forma con el BackColor en negro.

Más trabajo por hacer

Esta prueba de concepto no completa lo que necesitamos algunas clases / controles VFP ya que tendríamos algunos problemas al colocarlas en el área de cliente que sea generado con un fondo cristalino. Esto se debe, como puede imaginar, que todo lo que sea negro (como ForeColor y BackColor) será generado como traslúcido. Un par de soluciones sobre este tema son emplear controles ActiveX o clases de Windows como hice en el formulario anterior con el control Microsoft ProgressBar Control, versión 5.0 (SP2). La otra vía podría ger generar los elementos gráficos empleando GDI+ y en este respecto _gdiplus.scx que viene con Visual FoxPro 9.0 y el proyecto GDIPlus en VFPX vendrá definitivamente integrado. En cualquier evento, es muy fácil conocer que este tipo de efecto Aero Glass es realmente posible de hacer en Visual FoxPro 9.0. Me ha sorprendido gratamente encontrar que es sencillo de implementar.

Hasta la próxima ... ¡Visual FoxPro es genial!