Programación General > Visual Basic 6.0 e inferiores

 Problema Textbox (solo Numeros, Solo Letras)

<< < (2/2)

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&#036;(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&#036;(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

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa