19 de marzo de 2002

Convertir base Decimal a: Binario, Octal, Hexadecimal, etc.

Dos funciones para convertir un número en base decimal a cualquier base numérica, y de cualquier base numérica a base decimal.

Podemos convertir un número en base decimal a cualquier base numérica (hasta base 36) con la siguiente función:

*-------------------------------------------------------------
* FUNCTION Dec2Base()
*-------------------------------------------------------------
* Transforma un número decimal a base "n"
* PARAMETROS: 
*    tnDec: Numero a transformar
*    tnBase: Base numérica 
* USO: Dec2Base(16, 2)
* RETORNA: Caracter
*-------------------------------------------------------------
FUNCTION Dec2Base(tnDec, tnBase)
LOCAL lcNro, lnResto, lcChr
IF EMPTY(tnBase)
 tnBase = 10
ENDIF 
lcNro = ''
DO WHILE tnDec > 0
 lnResto = MOD(tnDec, tnBase)
 tnDec = INT(tnDec / tnBase)
 lcChr = IIF(lnResto < 10, STR(lnResto,1), CHR(lnResto+55))
 lcNro = lcChr + lcNro
ENDDO
RETURN(lcNro)

*------------------------------------------------------------

A la inversa, podemos convertir un número en cualquier base, a base decimal con la siguiente función

*-------------------------------------------------------------
* FUNCTION Base2Dec
*-------------------------------------------------------------
* Transforma un numero en base "n" a decimal
* PARAMETROS: 
*    tcNro: Numero a transformar
*    tnBase: Base numérica 
* USO: Base2Dec("FFAA", 16)
* RETORNA: Numerico
*-------------------------------------------------------------
FUNCTION Base2Dec(tcNro, tnBase)
LOCAL lnHasta, lnDec, lnI, lnAsc, lnPeso
IF EMPTY(tnBase)
 tnBase = 16
ENDIF 
tcNro = UPPE(ALLTRIM(tcNro))
lnHasta = LEN(tcNro)
lnDec = 0
FOR lnI = lnHasta TO 1 STEP -1
 lnAsc = ASC(SUBSTR(tcNro,lnI,1))
 lnPeso = IIF(BETWEEN(lnAsc,48,57),lnAsc-48,lnAsc-55)
 lnDec = lnDec + lnPeso * tnBase ^ (lnHasta - lnI)
ENDFOR
RETURN(lnDec)

*------------------------------------------------------------

Luis María Guayán

18 de marzo de 2002

Debugging Visual FoxPro Applications

Debugging Visual FoxPro Applications 
by Nancy Folsom (Inglés)



Author: Nancy Folsom
Edited by: Kelly Conway
ISBN: 1-930919-20-4
Length: 120 pages
Press date: February, 2002
Ebook format: .PDF

16 de marzo de 2002

Mi status de MVP

En este mes de Marzo de 2002, he recibido una muy buena noticia: Microsoft me otorgó el MVP de Visual FoxPro.

Este reconocimiento de MVP (Most Valuable Professional) de parte de Microsoft se le otorga a las personas que colaboran de manera voluntaria y desinteresada en las comunidades virtuales de Microsoft.

Mi participación en las comunidades virtuales comenzó en el año 1997 en el Grupo de Noticias en Español de Visual FoxPro. Sin duda mi participación en este grupo, aparte de aumentar mis conocimientos, me permitió conocer a gente maravillosa, con muchas de las cuales tengo una verdadera amistad vía Internet.

A partir del año 2000 contactamos con Pablo Roca, quien ya había creado PortalFox, y me comprometí a apoyarlo con mis colaboraciones y con el trabajo de mantenimiento del portal para así hacer crecer a PortalFox como una herramienta gratuita para todos los desarrolladores en Visual FoxPro de habla hispana. A este proyecto se le sumó luego Isaac Venegas que con su gran apoyo y empuje hizo crecer aun mas a PortalFox dentro de la comunidad.

En por ello que en este reconocimiento no debo dejar de agradecer a Pablo Roca (MVP) e Isaac Venegas (ambos SysOp's de PortalFox) por su gran apoyo.

También agradezco a la empresa en la cual trabajo (Vicente Trapani S.A.) que me brindó la posibilidad de capacitarme en Visual FoxPro con los máximos referentes de Visual FoxPro en Argentina: Antonio Castaño (MVP) y José Marcenaro (da-Vinci Innovación Tecnológica).

Son muchas las personas que también colaboran desinteresadamente en la comunidad de desarrolladores de Visual FoxPro y aun no recibieron el reconocimiento por parte de Microsoft, pero reciben día a día nuestro reconocimiento. Ellos son Carlos Yohn Zubiria, Isaac Venegas, Harold Godefroy, Victor Espina, Alexandre Hedreville y muchisimos mas (la lista sería interminable).

Gracias a todos por hacer crecer día a día esta comunidad y por compartir PortalFox.

Luis María Guayán
______________________________________________________
"La palabra imposible solo figura en el diccionario de los tontos"

13 de marzo de 2002

GETWORDCOUNT( ) y GETWORDNUM( )

Dos nuevas funciones de VFP 7 para el tratamiento de cadenas de texto.

Visual FoxPro 7.0 incorpora dos nuevas funciones que son muy útiles para el tratamiento de cadenas de texto:

GETWORDCOUNT( )
Cuenta el número de palabras de una cadena. 

Sintaxis:
  GetWordCount(cCadena[, cDelimitador])

Parámetros
  cCadena: Especifica la cadena de la que se va
    contar el número de palabras. 

  cDelimitador: [Opcional] Especifica el carácter 
    que se utiliza para delimitar grupos de 
    caracteres en cCadena. Puede utilizar este 
    parámetro para determinar el número de grupos 
    de caracteres, delimitados por el carácter 
    especificado, en cCadena. 

Valor devuelto
  Numérico

GETWORDNUM( )
Devuelve la palabra especificada de una cadena.

Sintaxis:
  GetWordNum(cCadena, nIndice[, cDelimitador])

Parámetros
  cCadena: Especifica la cadena que se va a evaluar. 

  nIndice: Especifica la posición del índice de la 
    palabra que se va a devolver. Por ejemplo, si 
    nIndice es 3, GetWordNum( ) devuelve la 
    tercera palabra. 

  cDelimitador: [Opcional] Especifica uno o más 
    caracteres especiales que se utilizan para 
    separar las palabras de cCadena. Los 
    delimitadores predeterminados son espacio, 
    tabulación y retorno de carro.  

Valor devuelto
  Caracter
Un pequeño ejemplo del uso de estas dos funciones:
lc = "Esto es una prueba en Visual FoxPro 7.0"
FOR ln = 1 TO GETWORDCOUNT(lc)
  ? GETWORDNUM(lc, ln)
ENDFOR
Luis María Guayán

11 de marzo de 2002

Tamaño de una imagen

Un truco para saber el tamaño de una imagen

Para conocer el tamaño de una imagen, creamos un objeto IMAGE, cargamos la imagen en el objeto y consultamos las propiedades WIDTH y HEIGHT.
_SCREEN.ADDOBJECT("oImg", "image")
_SCREEN.oImg.PICTURE = GETPICT()
_SCREEN.oImg.STRETCH = 0
? "IMAGEN: " + _SCREEN.oImg.PICTURE
? "ANCHO: " + ALLTRIM(STR(_SCREEN.oImg.WIDTH)) + " PIXELS"
? "ALTO: " + ALLTRIM(STR(_SCREEN.oImg.HEIGHT)) + " PIXELS"
_SCREEN.REMOVEOBJECT("oImg")
Luis María Guayán

6 de marzo de 2002

Incluir Imágenes en el Menú de VFP 6.0

Con estas funciones cambiaremos el aspecto de VFP 6.0 y lo haremos parecer a VPF 7.0

Insertando imágenes en lo menues de nuestras aplicaciones y hasta, como lo muestra el siguiente ejemplo, el propio menú de VPF 6.0
** 
** Insertar Imágenes en el Menú de VFP 6.0 
** 

DECLARE INTEGER FindWindow IN win32api STRING,STRING 
DECLARE INTEGER GetMenu    IN win32api INTEGER 
DECLARE INTEGER GetSubMenu IN win32api INTEGER,INTEGER 
DECLARE INTEGER LoadImage  IN win32api INTEGER,STRING,INTEGER,INTEGER,INTEGER,INTEGER 
DECLARE INTEGER SetMenuItemBitmaps IN win32api INTEGER,INTEGER,INTEGER,INTEGER,INTEGER 
DECLARE INTEGER GetMenuItemID IN win32api INTEGER,INTEGER 
DECLARE INTEGER ModifyMenu    IN win32api INTEGER,INTEGER,INTEGER,INTEGER,STRING 

* Especifico el Caption del Form donde se encuentra el Menú, 
* en el caso de ser un menú definido por el usuario. 

HWND = FindWindow(0,_SCREEN.CAPTION)      

* Modifico el menú principal de VFP. 

** Menú y Submenú a modificar, tomaremos como ejemplo el Menú "Archivo" 
lnHandleMenu    = GetMenu(HWND) 
lnHandleSubMenu = GetSubMenu(lnHandleMenu,0)  

  * El segundo parámetro indica el SubMenú a modificar, en este caso: 
  * 0 = Archivo 
  * 1 = Edición 
  * 2 = Ver 
  * 3 = Formato 
  * 4 = Herramientas 
  * 5 = Programa 
  * 6 = Ventana 
  * 7 = Ayuda 

** Path de las Imágenes. A modo de ejemplo se incluyen los de VFP. 
lcPathImagen1  = "C:\Archivos de programa\Microsoft Visual Studio\Vfp98\Wizards\Graphics\NEW.BMP" 
lcPathImagen2  = "C:\Archivos de programa\Microsoft Visual Studio\Vfp98\Wizards\Graphics\OPEN.BMP" 
lcPathImagen5  = "C:\Archivos de programa\Microsoft Visual Studio\Vfp98\Wizards\Graphics\SAVE.BMP" 
lcPathImagen15 = "C:\Archivos de programa\Microsoft Visual Studio\Vfp98\Wizards\Graphics\PRINT.BMP" 

** Carga de las Imagenes. 
lnImagen1  = LoadImage(0,lcPathImagen1 ,0,13,13,16) 
lnImagen2  = LoadImage(0,lcPathImagen2 ,0,13,13,16) 
lnImagen5  = LoadImage(0,lcPathImagen5 ,0,13,13,16) 
lnImagen15 = LoadImage(0,lcPathImagen15,0,13,13,16) 

  * Los 3 últimos parametros indican: ancho, alto y color de la imagen. 

** ID del Menu. 
lnMenuID1  = GetMenuItemID(lnHandleSubMenu,  0) 
lnMenuID2  = GetMenuItemID(lnHandleSubMenu,  1) 
lnMenuID5  = GetMenuItemID(lnHandleSubMenu,  4) 
lnMenuID15 = GetMenuItemID(lnHandleSubMenu, 14) 

  * El segundo parámetro representa la opción dentro del SubMenú: 
  *  0 = Nuevo 
  *  1 = Abrir 
  *  4 = Guardar 
  * 14 = Imprimir 

** Definición del Menu con la Imagen. 
SetMenuItemBitmaps(lnHandleSubMenu, lnMenuID1, 0, lnImagen1,  lnImagen1) 
SetMenuItemBitmaps(lnHandleSubMenu, lnMenuID2, 0, lnImagen2,  lnImagen2) 
SetMenuItemBitmaps(lnHandleSubMenu, lnMenuID5, 0, lnImagen5,  lnImagen5) 
SetMenuItemBitmaps(lnHandleSubMenu, lnMenuID15,0, lnImagen15,lnImagen15) 

** Modificación del Menu. 
ModifyMenu(lnHandleMenu, lnMenuID1, 0, lnMenuID1, "&Nuevo...    CTR+N") 
ModifyMenu(lnHandleMenu, lnMenuID2, 0, lnMenuID2, "&Abrir...    CTR+O") 
ModifyMenu(lnHandleMenu, lnMenuID5, 0, lnMenuID5, "&Guardar     CTR+S") 
ModifyMenu(lnHandleMenu, lnMenuID15,0, lnMenuID15,"&Imprimir    CTR+P") 

CLEAR DLLS

2 de marzo de 2002

Saber si un año es bisiesto

Dos rutinas que nos permitirán saber si un año es bisisesto

Para saber si un año es bisiesto, se deben cumplir tres reglas:
  • Un año es bisiesto si éste es divisible por 4.
  • Salvo que ese año sea divisible por 100.
  • Pero si el año es divisible por 400, entonces si es bisiesto.
Con estas tres reglas escribimos la primera función:
FUNCTION EsBisiesto(tnAnio)
    RETURN (tnAnio%4 = 0 AND tnAnio%100 # 0) OR tnAnio%400 = 0
ENDFUNC

La segunda función simplemente pregunta por el día 29 de Febrero del año que pasamos como parámetro. VFP verifica si esta fecha es válida y nos retorna una fecha vacia si no es válida:
FUNCTION EsBisiesto(tnAnio)
    RETURN NOT EMPTY(DATE(tnAnio, 02, 29))
ENDFUNC

Luis María Guayán

1 de marzo de 2002

Centrar una imagen en la pantalla principal (_Screen)

Podemos centrar una imagen en la pantalla principal de FoxPro, creando un objeto Image en _Screen

Ejemplo:
_SCREEN.ADDOBJECT("oImg", "Image")
_SCREEN.oImg.PICTURE = "C:\Imagenes\MiFoto.JPG"
_SCREEN.oImg.TOP = _SCREEN.HEIGHT/2 - _SCREEN.oImg.HEIGHT/2
_SCREEN.oImg.LEFT = _SCREEN.WIDTH/2 - _SCREEN.oImg.WIDTH/2
_SCREEN.oImg.VISIBLE = .T.

Luis María Guayán