Programación General > Visual Basic 6.0 e inferiores
Problema Textbox (solo Numeros, Solo Letras)
Nebire:
--- Cita de: "cpmario" --- Te agradezco nos ilustres en GAMBAS
Esto va para Nebire
Me disculpas pero el lapsus lo has cometido tu.
Ya que
--- Código: Text ---If InStr(strValidChars, strCharLetter) Then Hace el trabajo de localizar cualquiera de los caracteres anotados en la cadena.
Esa rutina es la que uso para detectar cualquier conjunto de caracteres que deseo filtrar.
En todo caso lo que tienes que hacer es colocar la rutina en el evento de un TextBox y ver si funciona
:comp:
--- Fin de la cita ---
Mis disculpas cpMario...
Después de revisar nuevamente tus líneas veo mi error. De alguna manera (que no entiendo cómo) habías interpretado que comparabas los caracteres válidos con el contenido del textbox, cuando claramente, lo haces sobre el cáracter pulsado.
... y me alegra que me hayas corregido, pués no es acorde que algo correcto quede como erróneo.
Nebire:
--- Cita de: "zaida20" ---
--- Código: Text ---'''''Solo numeros enteros******************PUBLIC SUB TextBox3_Change() CInt(textbox3.Text)'Convierte el numero en entero CATCH textbox3.Text = Mid$(textbox3.Text, 1, -1)'Si no es un numero borra el caracter STOP EVENT END 'Formato numero decimal ******************************************************PUBLIC SUB TextBox4_Change() CFloat(textbox4.Text) CATCH textbox4.Text = Mid$(textbox4.Text, 1, -1) STOP EVENT END
--- Fin de la cita ---
Hola Zaida, el caso es que la 1ª parte del código no me acaba de convencer, ya que la psoición que corriges no necesariamente tiene que coincidir con la posición en donde está el caracter mal.
Es frecuente que uno escriba algo como: 'El herido valbuciente gritó...' y después de escribir se percate que debe corregir un carácter entonces cambia Balbuciente por Valbuciente, pero la posición de escritura no es ya la última del texto. Tu rutina de textos funcionaría en ese caso porque atacas al carácter pulsado, en cambio no sucedera igual con los números.
El mismo ejemplo con números aunque lógicamente sea menos frecuente, también ocurre y en tu código daría error, supongamos que escribo '0123456789' pero luego me percato que que el 6 era en realidad un '0' y quiero corregirlo, retrocedo el cursor pero debido a la proximidad en tre la 'o' y el '0' pongamos que cometo el error de pulsar la 'o' y quedaría así: '012345o789' ... cómo no sé como se comporta gambas, no puedo predecir que ocurrirá exactamente, pero en el mejor de los casos te daría una cadena como esta: '012345' ( se supone que tras modificar el texto nuevamente se ejecuta el evento change y va eliminado caracteres uno a uno) y en el peor de los casos te dará una cadena como esta: '012345o78' (no creo, pero no conozco gambas).
Entonces tendemos que en el primer caso será un fastidio reintroducir nuevamente todos los caracteres eliminados, tanto más molesto cuanto más largo sea el contenido borrado, y en el 2º caso te ha borrado un carácter, pero persiste un error en la cadena no corregido.
Yo te sugiero que si utilizas el evento change del textbox examines todo el contenido de la cadena, porque suponer que sólo ha sido modificado el último carácter es demasiado atrevido sin haber tomado medidas al caso (podría perfectamente pegar un texto copiado de otro lugar lleno de letras y caracteres) y tu función iría eliminado sucesivamente caracteres hasta que toda la cadena RESTANTE fueran números, es decir si el primer caracter fuera una letra se borraría el contenido pegado completamente. Por tanto en el evento change realiza un examen completo de la cadena y ofrece al textbox una cadena corregida antes de salir del evento, le ahorrarás molestias al usuario.
En cambio si utilizas el evento keypress, tal como haces para las letras en efecto te bastará con comprobar sólo la tecla pulsada (y sólo si el texto es introducido por teclado, si el texto se introduce por pegado del usuario o por código interno mediante asignación, no saltará el evento keypress, entonces o limitas la forma de introducir texto a sólo por teclado o debes usar el evento change para dichos casos. Si usas keypress, siempre podrás usar tal como hiciste para las letras pero delimitanto el valor ASCII desde el 48 hasta el 57 ambos inclusive. El método de cpmario es si cabe más elegante que comparar los límites de código pués te permite reunir en una sola función cualquier posibilidad de letras o números creando unas constantes de 'strValidChars' como lo llamó cpmario, y en cada caso pasar a la función dicha constante.
Más aún, si admites la posibilidad de que pueda pegarse texto, podrías proveer una función que devuelve todos los caracteres numéricos existentes en dicha cadena eliminando todos los caracteres no numéricos o viceversa... para ello necesitarías un bucle que recorra toda la cadena cortando carácter a carácter y 'sumándolo' a la salida los válidos, es una limpieza de cadena bastante útil para casos como por ejemplo recibir entradas de tipo 'Vicente Pérez 12 años' y donde sólo te interesa tomar la parte numérica.
zaida20:
Hola!!!
Muchisimas gracias a los dos por contestarme y por las explicaciones (me quedó todo mucho más claro), voy a trabajar en ello.
Saludos y gracias de nuevo!!! :hola:
Navegación
[*] Página Anterior
Ir a la versión completa