• Lunes 29 de Abril de 2024, 02:57

Autor Tema:  Problema Textbox (solo Numeros, Solo Letras)  (Leído 5503 veces)

zaida20

  • Miembro MUY activo
  • ***
  • Mensajes: 213
    • Ver Perfil
Problema Textbox (solo Numeros, Solo Letras)
« en: Viernes 25 de Abril de 2008, 10:26 »
0
Hola a todos, tengo el siguiente problema.

Estoy utilizando Gambas (Linux) y necesito que un textbox sólo me permita introducir números y comas y otro TexBox sólo me permita intruducir letras. He estado buscando información y he probado varios códigos, pero ninguno me funciona:

 
Código: Text
  1. PUBLIC SUB TexBox1_KeyPress(KeyAscii AS Integer)
  2. IF KeyAscii <> 8 THEN
  3.    IF (KeyAscii < 48) OR (KeyAscii > 57) THEN
  4.    KeyAscii = 0
  5.    ENDIF
  6. ENDIF
  7. END
  8.  
Código: Text
  1. PUBLIC SUB TexBox1_KeyPress()
  2. IF Key.Code <> 8 THEN
  3.    IF (Key.Code < 48) OR (Key.Code > 57) THEN
  4.    Key.Code = 0
  5.    ENDIF
  6. ENDIF
  7. END
  8.  
Código: Text
  1. PUBLIC SUB TexBox1_KeyPress()
  2. IF NOT IsNumber(TextBox1.Text) THEN
  3. message.Info("Ingrese solo numeros")
  4. ENDIF
  5. END
  6.  
  7.  
¿Podeis ayudarme?
Saludos y gracias :hola:
---- Las oportunidades que se te presentan son las que son y ellas te llevarán a la felicidad ----

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Problema Textbox (solo Numeros, Solo Letras)
« Respuesta #1 en: Viernes 25 de Abril de 2008, 18:08 »
0
En VB6 uso esta rutina
Código: Text
  1.  
  2. Private Sub Text1_KeyPress(KeyAscii As Integer)
  3.    Dim strValidChars As String
  4.    Dim strTitle As String
  5.    Dim strCharLetter As String
  6.    strCharLetter = UCase(Chr$(KeyAscii))
  7.    'Cambiando strValidChar se puede usar para filtrar
  8.    'cualquier conjunto de caracteres
  9.    strValidChars = "0123456789.,"
  10.    If InStr(strValidChars, strCharLetter) Then
  11.        KeyAscii = Asc(strCharLetter)
  12.    ElseIf KeyAscii = 8 Or KeyAscii = 13 Then
  13.    Else
  14.        'Opcional, si deseas darle un aviso al usuario
  15.        'Lo puedes eliminar
  16.        strTitle = "+ Convención +"
  17.        MsgBox "Escriba solo números, puntos o comas.", vbInformation, strTitle
  18.        KeyAscii = 0
  19.    End If
  20. End Sub
  21.  

Puedes cambiar la línea
Código: Text
  1.  strValidChars = "0123456789.,"
  2.  
Por cualquier cadena de texto que desees validar por ejemplo:
Código: Text
  1.  strValidChars = "SCVDUscvdu"
  2.  
Para validar el estado civil de una persona, Soltero, Casado, Viudo, etc.
 :comp:

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Problema Textbox (solo Numeros, Solo Letras)
« Respuesta #2 en: Domingo 27 de Abril de 2008, 23:17 »
0
Es más cómod usar la función 'IsNumeric'. Esta función eválua una expresión y devuelve un valor buleano que indica si se puede tomar como número.

entonces un código podría ser algo así como:
Código: Text
  1.  
  2.    static textoAnterior as boolean
  3.  
  4.    if IsNumeric(textBox1.text) then
  5.        '...  acciones que deseamos hacer
  6.       
  7.        textoAntiguo=textbox1.text
  8.    else
  9.        textbox1.text=textoAnterior
  10.    end fi
  11.  
  12.  

La parte de 'else' no determina que sean sólo texto sólo que la expresión no puede valorarse como numérica, sin embargo puede aprovecharse para no repetir código añadiendo más cófigo y diferenciando la validación de cuando se pide valorar sólo números o sólo letras.
En tonces el código enterior embebido en una función sería algo como:

Código: Text
  1.  
  2.   public function evaluar_TextoComo(modo as boolean, texto as string) as boolean
  3.       dim resultado as boolean
  4.     
  5.       if IsNumeric(texto) then
  6.             resultado=true
  7.       else
  8.            for k=0 to 9
  9.                 If InStr(1, texto, cstr(k))<>0 Then  
  10.                     exit function
  11.                 end if              
  12.            next
  13.            resultado=true ' si no salió al llegar aquí, no se encontró números, es ok.
  14.       end if
  15.  
  16.        evaluar_TextoComo=resultado and modo
  17.   end function
  18.  
  19.  

En vb ila función 'IsStr' permite buscar una cadena dentro de otra, si se existe devuelve la posición donde empieza la coincidencia, por ellos usa 3 parámetros, el primero es para indicarle la posición del carácter desde el que queremos iniciar la búsqueda, los otros son la cadena donde buscar y la cadena que se busca...

Nuestro amigo cpMario ha cometido un pequeño lapsus, ya que si le pasamos la cadena "0123456789" como cadena a buscar intentará encontrar ese texto exacto y no cualquiera de los caracteres que contiene, por ello es necesario usar un bucle o intentar otra función más compleja...


No sé en 'gambas' pero visual Basic, hay que tener a veces cuidado con los puntos y las comas, ya que en español se usan de modo inverso al inglés y determinadas funciones pueden 'comportarse' de un modo no esperado. Si es el caso, conviene añadir código para controlarlo...

Ignoro si en 'gambas' la función IsNumber' que utilizas determina sólo si es un valor numérico o si se puede interpretar como tal, si es el primer caso, puedes implementar la función 'IsNumeric' con una sencilla  función como la siguiente:

Código: Text
  1.  
  2.    public function IsNumeric(texto as string) as boolean
  3.        dim v as double
  4.  
  5.        on error goto noNumerable
  6.        v= texto /2
  7.        isNumeric=true
  8.        exit function
  9.    noNumerable:   'sale con valor false
  10.           if val(texto)<>0 then IsNumeric=true
  11.    end function
  12.  
  13.  

El mecanismo de esta función se basa en que si no no se puede cuantificar como número se origina un error .  hay 3 casos posibles: todo el texto sean números: ejmplo: "3456734",  en los demás casos dará error, pero todavía se acptarán como válidos aquellos que empiecen por números.
esto: "3456123" devolcerá true
esto: "dfjghd999" devolverá false
esto: "3456asjfht" devolverá true
esto: "0" devolverá true
«Ma non troppo»
----> ModoVacaciones = False<----

zaida20

  • Miembro MUY activo
  • ***
  • Mensajes: 213
    • Ver Perfil
Re: Problema Textbox (solo Numeros, Solo Letras)
« Respuesta #3 en: Martes 29 de Abril de 2008, 12:26 »
0
Muchas gracias por contestar, al final he conseguido solucionarlo asi:

Código: Text
  1. '''''Solo numeros enteros******************
  2. PUBLIC SUB TextBox3_Change()
  3.  
  4.    CInt(textbox3.Text)'Convierte el numero en entero
  5.  
  6.  CATCH
  7.  
  8.  textbox3.Text = Mid&#036;(textbox3.Text, 1, -1)'Si no es un numero borra el caracter
  9.  
  10.  STOP EVENT
  11.  
  12. END
  13.  
  14. 'Formato numero decimal ******************************************************
  15. PUBLIC SUB TextBox4_Change()
  16.  
  17.   CFloat(textbox4.Text)
  18.  
  19.  CATCH
  20.  
  21.  textbox4.Text = Mid&#036;(textbox4.Text, 1, -1)
  22.  
  23.  STOP EVENT
  24.  
  25. END
  26.  
  27. 'Solo letras*********************
  28. PUBLIC SUB TextBox5_KeyPress()
  29.  
  30.  IF Key.Code &#60;&#62; 8 THEN
  31.      IF (Key.Code &#60; 65) OR (Key.Code &#62;90 ) THEN
  32.      STOP EVENT
  33.      ENDIF
  34.  END IF
  35.  
  36. END
  37.  

Saludos  :hola:
---- Las oportunidades que se te presentan son las que son y ellas te llevarán a la felicidad ----

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Problema Textbox (solo Numeros, Solo Letras)
« Respuesta #4 en: Martes 29 de Abril de 2008, 17:10 »
0
Te agradezco nos ilustres en GAMBAS


Esto va para Nebire

Me disculpas pero el lapsus lo has cometido tu.
Ya que
Código: Text
  1. If InStr(strValidChars, strCharLetter) Then
  2.  
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:

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Problema Textbox (solo Numeros, Solo Letras)
« Respuesta #5 en: Miércoles 30 de Abril de 2008, 01:36 »
0
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
  1. If InStr(strValidChars, strCharLetter) Then
  2.  
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:
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.
«Ma non troppo»
----> ModoVacaciones = False<----

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Problema Textbox (solo Numeros, Solo Letras)
« Respuesta #6 en: Viernes 2 de Mayo de 2008, 20:05 »
0
Cita de: "zaida20"

Código: Text
  1. '''''Solo numeros enteros******************
  2. PUBLIC SUB TextBox3_Change()
  3.  
  4.    CInt(textbox3.Text)'Convierte el numero en entero
  5.   
  6.  CATCH
  7.  
  8.  textbox3.Text = Mid&#036;(textbox3.Text, 1, -1)'Si no es un numero borra el caracter
  9.  
  10.  STOP EVENT
  11.  
  12. END
  13.  
  14. 'Formato numero decimal ******************************************************
  15. PUBLIC SUB TextBox4_Change()
  16.  
  17.   CFloat(textbox4.Text)
  18.   
  19.  CATCH
  20.  
  21.  textbox4.Text = Mid&#036;(textbox4.Text, 1, -1)
  22.  
  23.  STOP EVENT
  24.  
  25. END
  26.  
  27.  
  28.  
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.
«Ma non troppo»
----> ModoVacaciones = False<----

zaida20

  • Miembro MUY activo
  • ***
  • Mensajes: 213
    • Ver Perfil
Re: Problema Textbox (solo Numeros, Solo Letras)
« Respuesta #7 en: Martes 6 de Mayo de 2008, 12:37 »
0
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:
---- Las oportunidades que se te presentan son las que son y ellas te llevarán a la felicidad ----