Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Posible Bug En El Evento KeyPress Del Cuadro De Control ?
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Posible Bug En El Evento KeyPress Del Cuadro De Control ? 
 
Hola,

Estoy comenzando en esto de gambas, y para familiarizarme estoy desarrollando una pequeña aplicación para la gestión de clientes. Pero lo que me trae aquí es que en el evento KeyPress de un cuadro de texto no me diferencia entre mayúsculas y minúsculas, entendiendo ambas como mayúsculas. El código, con el que limito en número de dígitos y el tipo, es el siguiente:

PUBLIC SUB TNif_KeyPress()
     Establece los dígitos que se pueden introducir, y cuántos
     SELECT CASE Key.code
          CASE Asc("a") TO Asc("z")
              IF Len(TNif.Text) > 8 THEN
                   STOP EVENT
              ELSE
                   message("12")
                    'Convierte las minúsculas en mayúsculas
                    TNif.Insert(UCase(Key.Text))
                    STOP EVENT
              END IF
          CASE Asc("0") TO Asc("9")
              IF Len(TNif.Text) > 8 THEN STOP EVENT
          CASE Asc("A") TO Asc("Z")
              IF Len(TNif.Text) > 8 THEN STOP EVENT
          CASE key.BackSpace
          CASE key.Delete
          CASE key.Tab
          CASE key.Enter
          CASE key.Return
          CASE ELSE
               STOP EVENT
     END SELECT
    
END

Actualmente estoy trabajando con Ubuntu 9.10 y Gamas 2.18, has antes de la actualización (tenía gambas 2.13 con Ubuntu 9.04) y no me daba problemas. ¿ A alguien le ha pasado esto ?. Muchas gracias.
 



 
lumbanico - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Posible Bug En El Evento KeyPress Del Cuadro De Control ? 
 
Hola
Cometes un error al testear mediante códigos ascii porque en Linux esos valores pueden dar muy diferentes valores según el charset del sistema, el charset del escritorio, el entorno gráfico, ..., etc

Para testear el teclado gambas propone la clase key que permite acceder a un caracter o su código sin necesidad de acceder al código ascii que trae problemas.

En vez de ASC("A") usa key["A"]

La clase key

Además gambas proporciona una serie de funciones para testear el teclado
Citar:

IsAscii     Comprueba si una cadena contiene sólo caracteres ASCII.
IsBlank     Comprueba si una cadena contiene sólo caracteres de espacio o tabulaciones.
IsDigit     Comprueba si una cadena contiene sólo dígitos.
IsHexa     Comprueba si una cadena contiene sólo dígitos hexadecimales.
IsLCase     Comprueba si una cadena contiene sólo letras minúsculas.
IsLetter     Comprueba si una cadena contiene sólo letras.
IsPunct     Comprueba si una cadena contiene sólo caracteres no alfanuméricos representables.
IsSpace     Comprueba si una cadena contiene sólo caracteres de espacio.
IsUCase     Comprueba si una cadena contiene sólo letras mayúsculas.


Funciones de testeo del teclado

Por último verás que gambas no detecta la ñ como letra por ejemplo así que puedes tener algún problema al testear el teclado. Por eso yo me hice una clase que me sirviera para testearlo adecuadamente. Para que tomes como ejemplo te pongo una rutina de keypress

PUBLIC SUB controles_KeyPress()
DIM var AS Boolean = TRUE

SELECT CASE var
  'CASE TEC.Esletra(Key.text)  'saber si es letra incluyendo ñ o Ñ
  CASE TEC.EsAlfa(Key.text) 'saber si es letra, signo de puntuación o espacio
  CASE IsDigit(Key.text) 'saber si es un dígito
  CASE IsSpace(Key.text) 'saber si es espacio
  CASE TEC.EsBorrar(Key.code) 'saber si es una tecla de borrar
  CASE TEC.Esflecha(Key.code) 'saber si es una tecla de desplazamiento del cursor
  CASE ELSE
    STOP EVENT 'en otro caso cancelar la tecla
END SELECT
END


Y aquí te pongo las funciones que yo tengo en la clase TEC y que me sirven para testear el teclado adecuadamente:

Esta función devuelve true si es letra incluyendo la ñ o la Ñ
PUBLIC FUNCTION Esletra(l AS String) AS Boolean
DIM R AS Boolean
IF IsLetter(l) THEN
  r = TRUE
ELSE
  r = EsENe(l)
ENDIF
RETURN r
END


Esta función devuelve TRUE si es Ñ o ñ
PRIVATE FUNCTION EsENe(l AS String) AS Boolean
DIM r AS Boolean

IF InStr(l, "Ñ") > 0 OR InStr(l, "ñ") > 0 THEN
  r = TRUE
ENDIF
RETURN r
END


Esta función devuelve true si es letra, signo de puntuación o si es espacio. Es práctica para escribir direcciones y cosas así.
PUBLIC FUNCTION EsAlfa(l AS String) AS Boolean
DIM r AS Boolean

r = IsPunct(l) 'admitir caracteres [ !"#$%&'()*+,-./:;<\=>?@[\]^_`{|}~ ]
IF NOT r THEN
  r = Esletra(l)
ENDIF
IF NOT r THEN
  r = IsSpace(l)
ENDIF
RETURN r
END


Esta función devuelve true si se ha pulsado tecla válida para un campo de fecha (números, punto, barra o dos puntos)
PUBLIC FUNCTION EsFecha(l AS String) AS Boolean
  DIM valor AS Boolean
  
  valor = TRUE
  IF l <> Key[":"] THEN
    IF l <> Key["/"] THEN
      IF l <> Key["."] THEN
        IF NOT IsDigit(l) THEN
          valor = FALSE
        ENDIF
      ENDIF
    ENDIF
  ENDIF
  RETURN valor
  
END

Ojo con esta función porque en ella permito que para meter fechas se puedan utilizar el separador punto, el dos puntos o la barra, pero luego para comprobar si lo introducido es una fecha válida (el isdate de vb) hay que poner la fecha en formato ingles (mm/dd/yyyy) y el separador debe ser la barra o te dará error. Yo permito que el usuario escriba la fecha como quiera, pero luego llamo a una función que convierte la fecha al formado adecuado y lo dejo en el tag. Así un textbox de pedir fecha llamado DESDE yo llamo a esta función y el resultado lo dejo en DESDE.TAG.
PUBLIC FUNCTION cfecha(f AS String) AS String
DIM fe AS String[], del AS String
del = IIf(IsDigit(Mid(f, 3, 1)), Mid(f, 2, 1), Mid(f, 3, 1))
fe = Split(f, del)
f = fe[1] & "/" & fe[0] & "/" & fe[2]
RETURN f
END

Como ves averiguo el separador que se usó y separo en dias, meses y años. Luego los pongo en el orden adecuado y les pongo el separador / que es el que funciona bien con isdate. Así cuando quiero saber si es una fecha válida en vez de preguntar isdate(desde.text) pregunto isdate(desde.tag) y ya está.

Esta función devuelve TRUE si se han pulsado teclas de borrado (delete o backspace)
PUBLIC FUNCTION EsBorrar(l AS Integer) AS Boolean
  DIM B AS Boolean
  IF l = Key.BackSpace OR l = Key.Delete THEN
    b = TRUE
  ENDIF
  RETURN b
END


Esta función devuelve TRUE si se han pulsado teclas del cursor
PUBLIC FUNCTION Esflecha(l AS Integer) AS Boolean
  DIM B AS Boolean
  IF l = Key.right OR l = Key.left OR Key.up OR Key.Down THEN
    b = TRUE
  ENDIF
  RETURN b
END

 



 
última edición por soplo el Lunes, 30 Noviembre 2009, 22:15; editado 1 vez 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Posible Bug En El Evento KeyPress Del Cuadro De Control ? 
 
Viejo, ha estudiar un poquito más que por algo está el libro de gambas en la sección de descargas, ¿si?

Otra cosa: REFACTORING

No explico el código que sigue porque me parece que es totalmente autoexplicativo.


PUBLIC SUB Form_Open()
  TNif.MaxLength = 8
END

PUBLIC SUB TNif_KeyPress()
DIM TeclaOK AS Boolean 'se auto-inicializa a False
      
    TeclaOK = (key.Code = key.BackSpace) OR (key.Code = key.Delete) OR (key.Code = key.Tab) OR (key.Code = key.Return)
    TeclaOK = TeclaOK OR IsLetter(key.text) OR IsDigit(key.Text) OR (key.Code = key.End) OR (key.Code = key.Home)
    TeclaOK = teclaOK OR (key.Code = key.Left) OR (key.Code = key.Right)

    IF TeclaOK THEN
      IF IsLetter(key.Text) THEN
        TNif.Insert(UCase(key.Text))
        STOP EVENT
      ENDIF
    ELSE
      STOP EVENT
    ENDIF

END
 

 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Posible Bug En El Evento KeyPress Del Cuadro De Control ? 
 
Fantástico, muchas gracias por todo.
 



 
lumbanico - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Posible Bug En El Evento KeyPress Del Cuadro De Control ? 
 
fabianfv escribió: [Ver mensaje]
Viejo, ha estudiar un poquito más que por algo está el libro de gambas en la sección de descargas, ¿si?

Otra cosa: REFACTORING

No explico el código que sigue porque me parece que es totalmente autoexplicativo.


PUBLIC SUB Form_Open()
  TNif.MaxLength = 8
END

PUBLIC SUB TNif_KeyPress()
DIM TeclaOK AS Boolean 'se auto-inicializa a False
      
    TeclaOK = (key.Code = key.BackSpace) OR (key.Code = key.Delete) OR (key.Code = key.Tab) OR (key.Code = key.Return)
    TeclaOK = TeclaOK OR IsLetter(key.text) OR IsDigit(key.Text) OR (key.Code = key.End) OR (key.Code = key.Home)
    TeclaOK = teclaOK OR (key.Code = key.Left) OR (key.Code = key.Right)

    IF TeclaOK THEN
      IF IsLetter(key.Text) THEN
        TNif.Insert(UCase(key.Text))
        STOP EVENT
      ENDIF
    ELSE
      STOP EVENT
    ENDIF

END
 


Buenas noches fabianFv gracias por tu aporte estoy tratando de hacer un pequeño modulo que me verifique la inactividad de los ocntroles en un formulario, es decir, quiisera saber cuando un textbox esta activo o hay algun evento (Delete,Badscape, Tab,etc) este activo, sino hay ningun evento activo se me dispare un timer con un contador de 3minutos y est me cierre le formulario, podrias ayudarme he tratado con tu ejemplo pero no lo he logrado. gracias de antemano
 



 
jcontasti - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Posible Bug En El Evento KeyPress Del Cuadro De Control ? 
 
Yo hice lo siguiente en este caso usando el ejemplo de Fabian pero usando una clase estatica. Es un poco antiguo el tema pero queria ver en como lo puedo mejorar para ver si me entregan alguna ideas, comentare algo sobre los metodos utilizados.

  El metodo Clean lo que hace es limpiar los objetos textbox, combobox y treeview de los cuales existan en un formulario
  El metodo Name lo utilizo cuando necesite registrar nombre que sea en mayuscula y letra con ñ en un control ya sea combobox o textbox
  El metodo Value es para incluir solo numeros en algun control [/list]


Create Static

Static Public Sub Clean(hForm As Form)
  Dim hControl As Control, hText As TextBox, hCombo As ComboBox, hTree As TreeView

    For Each hControl In hForm.Controls
        Select Object.Type(hControl)
          Case "TextBox"
            hText = hControl
            hText.Clear
            hText.Background = Color.Default
          Case "ComboBox"
            hCombo = hControl
            hCombo.Text = ""
            hCombo.Background = Color.Default
          Case "TreeView"
            hTree = hControl
            hTree.Clear
        End Select
    Next

End

Static Public Sub Name(hControl As Control)
    Dim hText As TextBox, hCombo As ComboBox

    Select Key.Code
        Case Key.Tab
        Case Key.Space
        Case Key.BackSpace
        Case Key.Left
        Case Key.Right
        Case Key.Delete
        Case 65 To 90, 209
            Select Object.Type(hControl)
                Case "TextBox"
                    hText = hControl
                    hText.Insert(String.UCase(Key.Text))
                Case "ComboBox"
                    hCombo = hControl
                    hCombo.Insert(String.UCase(Key.Text))
            End Select
            Stop Event
        Case Else
            Stop Event
    End Select

End

Static Public Sub Value(hControl As Control)

    Select Key.Code
        Case Key.BackSpace
        Case Key.Left
        Case Key.Right
        Case Key.Delete
        Case 47 To 58
        Case Else
            Stop Event
    End Select

End

 

 



 
gara_pm - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Posible Bug En El Evento KeyPress Del Cuadro De Control ? 
 
fabianfv escribió: [Ver mensaje]
Viejo, ha estudiar un poquito más que por algo está el libro de gambas en la sección de descargas, ¿si?

Otra cosa: REFACTORING

No explico el código que sigue porque me parece que es totalmente autoexplicativo.


PUBLIC SUB Form_Open()
  TNif.MaxLength = 8
END

PUBLIC SUB TNif_KeyPress()
DIM TeclaOK AS Boolean 'se auto-inicializa a False
      
    TeclaOK = (key.Code = key.BackSpace) OR (key.Code = key.Delete) OR (key.Code = key.Tab) OR (key.Code = key.Return)
    TeclaOK = TeclaOK OR IsLetter(key.text) OR IsDigit(key.Text) OR (key.Code = key.End) OR (key.Code = key.Home)
    TeclaOK = teclaOK OR (key.Code = key.Left) OR (key.Code = key.Right)

    IF TeclaOK THEN
      IF IsLetter(key.Text) THEN
        TNif.Insert(UCase(key.Text))
        STOP EVENT
      ENDIF
    ELSE
      STOP EVENT
    ENDIF

END
 


No nos olvidemos que con "With Key" puedes ahorrarte otros 60 caracteres, y posiblemente una loc más.  

jcontasti escribió: 

Buenas noches fabianFv gracias por tu aporte estoy tratando de hacer un pequeño modulo que me verifique la inactividad de los ocntroles en un formulario, es decir, quiisera saber cuando un textbox esta activo o hay algun evento (Delete,Badscape, Tab,etc) este activo, sino hay ningun evento activo se me dispare un timer con un contador de 3minutos y est me cierre le formulario, podrias ayudarme he tratado con tu ejemplo pero no lo he logrado. gracias de antemano


Volviendo al tema, puedes usar la propiedad Group en la IDE para que todos los controles ejecuten el mismo evento, en este caso Change (que por cierto, no sera ejecutado si no pasa la validacion en KeyPress). La mejor forma es hacer que el Timer empiece a correr al abrir el formulario y hacer que se resetee a 180.000 ms = 180 s = 3min. En el evento _Timer, simplemente se lo detiene y se cierra el formulario.

Por otra parte:

soplo escribió: 

Cometes un error al testear mediante códigos ascii porque en Linux esos valores pueden dar muy diferentes valores según el charset del sistema, el charset del escritorio, el entorno gráfico, ..., etc


Eso no es correcto. Un carácter US-ASCII conserva su valor en cualquier sistema. Hago énfasis en esto porque si su valor (binario, decimal, hexadecimal),  cambiara, la Internet seria literalmente imposible, ya que la mayoría de las especificaciones no actualizadas en los últimos años aún depende de este conjunto de caracteres. Aquí puedes ver un documento donde de explica en forma completa que caracteres abarca y que valores toman.

Si bien aún es usado, su uso fue superado por UTF-8 en el 2007. Esto se debe a que US-ASCII solo reconoce 128 caracteres (siendo muchos de control, como \n o \r y muy pocos imprimibles), mientras que UTF-8 reconoce hasta 1,112,064 caracteres (este número tuvo que ser limitado por razones de compatibilidad, pero sabiendo que UTF-8 utiliza 6 bytes -> 8*6=48, 2^48=un código por cada carácter que existió en la vida del hombre)

Por cierto, sabiendo que todos aquí hablamos español, y que los caracteres con acentos no están dentro de US-ASCII, siempre deberíamos usar String.Code() en lugar de Asc()


Espero que la info les sea útil!

Saludos!
 



 
sebikul - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Control De Evento Usando Last SOLUCIONADO ljma Aplicaciones/Fragmentos de Código 5 Miercoles, 22 Febrero 2012, 23:00 Ver último mensaje
ljma
No hay nuevos mensajes Evento Click En El Control ListBox datobinario General 14 Miercoles, 13 Marzo 2013, 23:12 Ver último mensaje
datobinario
No hay nuevos mensajes Evento Select,Evento Activate, Evento Mous... Shell General 1 Domingo, 18 May 2014, 09:34 Ver último mensaje
Shell
No hay nuevos mensajes ¿Cual Es El Evento Donde Se Crea Y Carga ... gambafeliz Controles/Librerías/Componentes 7 Sabado, 21 Septiembre 2019, 16:00 Ver último mensaje
gambafeliz
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron