Manipulación de la Entrada Numérica en Visual FoxPro
Visual FoxPro, una herramienta poderosa en el desarrollo de aplicaciones de bases de datos, permite a los desarrolladores personalizar la experiencia del usuario de una manera muy precisa. Uno de los aspectos que se pueden personalizar es cómo se introducen los datos en los campos de texto, particularmente los numéricos. A menudo, los desarrolladores enfrentan la solicitud de permitir la entrada de números en un cuadro de texto comenzando desde el dígito más significativo, es decir, de derecha a izquierda. En este artículo, exploraremos cómo se puede lograr este comportamiento en Visual FoxPro.
Configuración del TextBox
Para poder controlar la dirección de la entrada de datos en un TextBox, es necesario configurar sus propiedades de manera adecuada. Visual FoxPro no incluye una propiedad nativa para este propósito, pero con algo de lógica y programación, es posible implementarlo. A continuación, se muestra cómo configurar un control TextBox para lograr la inserción de números de derecha a izquierda.
Creando el TextBox
Primero, se debe crear un cuadro de texto en el formulario para poder manipular su entrada. A continuación se presenta un ejemplo de cómo se podría definir:
DEFINE WINDOW wExample FROM 1,1 TO 10,30 DEFINE TEXTBOX txtNumber FROM 2,2 TO 4,28 PARENT wExample ACTIVATE WINDOW wExample
Implementación del Comportamiento
Una vez que se tiene creado el TextBox, el siguiente paso es manipular el evento de entrada de teclado para cambiar la dirección del cursor y la inserción del texto. Esto requiere escribir una función personalizada para el evento KeyPress.
Este es un código de ejemplo que ilustra cómo manejar el evento:
PROCEDURE txtNumber.KeyPress LPARAMETERS nKeyCode, nShiftAltCtrl THIS.Value = CHR(nKeyCode) + THIS.Value ENDPROC
En el código anterior, cada vez que se presiona una tecla, se captura el evento y se añade el carácter al inicio de la cadena existente en txtNumber.Value. Este enfoque simple invierte efectivamente la dirección en la que se introducen los caracteres.
Trabajando con Números Enteros y Decimales
Si el programa necesita manejar decimales, la lógica se complica ligeramente. Es necesario determinar si el carácter introducido se debe colocar antes o después del punto decimal. A continuación, se presenta un ejemplo de cómo implementar la lógica para manejar la entrada de números con decimales de derecha a izquierda:
PROCEDURE txtNumber.KeyPress LPARAMETERS nKeyCode, nShiftAltCtrl LOCAL lcChar, lcCurrentValue, lnDotPos lcChar = CHR(nKeyCode) lcCurrentValue = THIS.Value lnDotPos = AT(".", lcCurrentValue) IF lnDotPos = 0 THIS.Value = lcChar + lcCurrentValue ELSE THIS.Value = LEFT(lcCurrentValue, lnDotPos - 1) + lcChar + SUBSTR(lcCurrentValue, lnDotPos) ENDIF ENDPROC
En este caso, el código busca la posición del punto decimal y dependiendo de si existe o no, inserta el número en el lugar correspondiente.
Manejo de Errores y Validaciones
Aunque la lógica de inserción puede ser simple, no se debe subestimar la necesidad de incluir un manejo de errores robusto y validaciones dentro del programa. Esto asegura que la entrada del usuario sea siempre un número válido y se encuentra dentro de los parámetros esperados por la aplicación.
PROCEDURE txtNumber.KeyPress LPARAMETERS nKeyCode, nShiftAltCtrl IF nKeyCode >= 48 AND nKeyCode <= 57 OR nKeyCode = 46 LOCAL lcChar, lcCurrentValue, lnDotPos lcChar = CHR(nKeyCode) lcCurrentValue = THIS.Value lnDotPos = AT(".", lcCurrentValue) IF lnDotPos = 0 THIS.Value = lcChar + lcCurrentValue ELSE THIS.Value = LEFT(lcCurrentValue, lnDotPos - 1) + lcChar + SUBSTR(lcCurrentValue, lnDotPos) ENDIF ELSE NODEFAULT ENDIF ENDPROC
En el código de arriba, solo se permite la inserción de caracteres que caigan dentro del rango ASCII de números del 0 al 9 (48 a 57) y del punto (46), evitando así caracteres no deseados.