Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Letras "p" Y "z" Minúsculas No Funcionan En Mi Programa
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Letras "p" Y "z" Minúsculas No Funcionan En Mi Programa 
 
Hola a todos:
Gracias por la ayuda que me han brindado muchos.

Ahora resulta que tengo otro problema. Hice un programa para catalogar mi colección de discos de películas, pero resulta ser que mientras lo usaba noté que la letra p y la z minúsculas no son escritas en ningún control del programa. He buscado bastante, pero no encuentro ningún problema similar y he revisado el código pero no encuentro algo que esté interfiriendo. Si alguien tiene alguna sugerencia, estaría muy agradecido. Les dejo el código. Gracias.

PD: no se rian del nombre que le puse XD: "Catalogador Argentino Nadia"

CAN-1.0.1.tar.gz
Descripción: Catalogador Argentino Nadia 
Descargar
Nombre del archivo: CAN-1.0.1.tar.gz
Tamaño: 20.59 KB
Descargado: 37 veces
CAN-1.0.1.tar.gz
Descripción: Catalogador Argentino Nadia 
Descargar
Nombre del archivo: CAN-1.0.1.tar.gz
Tamaño: 20.59 KB
Descargado: 37 veces
CAN-1.0.1.tar.gz
Descripción: Catalogador Argentino Nadia 
Descargar
Nombre del archivo: CAN-1.0.1.tar.gz
Tamaño: 20.59 KB
Descargado: 37 veces

 



 
última edición por drjuano el Lunes, 28 Marzo 2011, 00:13; editado 1 vez 
drjuano - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Letras "p" Y "z" Minúsculas No Funcionan En Mi Programa 
 
Hola
PUBLIC SUB main(tipo AS String)

SELECT CASE tipo
CASE "numeros y letras" 'solo numeros y letras
  SELECT CASE Key.Code 'Se fija que la tecla presionada no sea las que figuran en los CASEs
      CASE 48 TO 57 'numeros
      CASE 65 TO 90 'mayusculas
      CASE 97 TO 122 'minusculas
      CASE 164 TO 165 'eñe mayuscula y minúscula
      CASE Key.BackSpace
      CASE Key.Delete
      CASE Key.Up
      CASE Key.Down
      CASE Key.Left
      CASE Key.Right
      CASE ELSE
           STOP EVENT 'si lo que se presiona es algo fuera de lo establecido, se para
  END SELECT

CASE ELSE

END SELECT

END
 

Tu recibes un parámetro string que guardas en tipo. Allí hay por tanto un "A" o un "z" o lo que sea pulsado. En el select case tienes puestas los casos preguntando por valores integer aunque tu pones select case tipo

No me gusta como lo haces y te buscas los problemas. Te explico como lo hago yo.
En el keypress pongo el siguiente código (siempre el mismo)
public sub txt_keypress()
DIM Valido AS Integer
  IF Key.code < 1000 THEN
    valido = TEC.VerTecla(LAST.tag, Key.Text)
  ELSE
    valido = valido OR TEC.verteclaesp(Key.code)
  ENDIF
  IF valido = 0 THEN
    STOP EVENT
  ENDIF
end
 

Este código lo que hace es ver si la tecla pulsada corresponde a una tecla imprimible o a una no imprimible. Si es imprimible llama a Vertecla y le pasa la propiedad TAG y el caracter pulsado. Si retorna 0 es que la tecla no es vália. La propiedad TAG la utilizo para indicar que tipo de caracteres debe admitir. Por ejemplo si el tag es F significa que debe admitir caracteres de fecha (números y /), si el tag es "L" debe admitir letras, si el tag es "N" debe admitir Numeros, si el tag es "LN" debe admitir letras y números, todo así. Tengo hechos muchos tags distintos. Los hay para letras, números, fechas, dominio, email, url, etc. Cuando quiero pedir un email le pongo el tag "@" y sé que se admiten únicamente caracteres válidos en un email.

La otra función es VerTeclaEsp a la que se le pasa el código de esa tecla e igualmente devuelve 0 si la tecla es falsa.

Te pongo un ejemplo de la función VerTecla
PUBLIC FUNCTION VerTecla(tag AS String, tecla AS String) AS Boolean
DIM Valido AS Boolean = FALSE
IF tag = "*" THEN
  valido = TRUE
  RETURN valido
ENDIF
IF InStr(tag, "L") > 0 THEN
  valido = IIf(Esletra(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "N") > 0 THEN
  valido = valido OR IIf(EsNumero(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "E") > 0 THEN
  valido = valido OR IIf(IsSpace(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "P") > 0 THEN
  valido = valido OR IIf(IsPunct(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "F") > 0 THEN
  valido = valido OR IIf(EsFecha(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "T") > 0 THEN
  valido = valido OR IIf(EsHora(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "C") > 0 THEN
  valido = valido OR IIf(escant(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "@") > 0 THEN
  valido = valido OR IIf(EsEmail(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "H") > 0 THEN
  valido = valido OR IIf(EsLink(tecla), TRUE, FALSE)
ENDIF
RETURN valido
END

Como ves si en tag hay un * se admite cualquier cosa. Si hay otra cosa entonces se llama a una función pequeñita que comprueba si la tecla pulsada es válida en ese caso. Te pongo por ejemplo la de validar fechas que admite únicamente números y /
PRIVATE FUNCTION EsFecha(l AS String) AS Boolean
  DIM valor AS Boolean
  valor = IIf(InStr("/0123456789", l) > 0, TRUE, FALSE)
  RETURN valor
END

Y así cuando quiero admitir fechas en un textbox hago
Text.tag="F"
y sé que el keypress solo dará como válida la fecha si se han pulsado dígitos o separador /.

Otro caso corriente, cuando quiero aceptar una cantidad solo debe aceptar dígitos y la coma
PRIVATE FUNCTION escant(tecla AS String) AS Boolean
DIM valido AS Boolean
  valido = IIf(InStr("0123456789.,", tecla) > 0, TRUE, FALSE)
  RETURN valido
END


Funciona perfectamente, lo tengo así en todos mis proyectos con solo incorporar la función en el keypress. Si tengo varios controles en un formulario los pongo a todos en el mismo grupo, pongo el evento keypress común para todos y a cada uno el tag que le corresponda según las teclas que deba permitir.

Te sugiero que le des unas vueltas a esto porque realmente ayuda mucho, funciona muy bien y agregar algo nuevo (por ejemplo un código para que te admita cuentas corrientes bancarias o dni o lo que sea es tan faácil como añadir un nuevo case y poner un funcioncita pequeña que compruebe si la tecla pulsada es correcta en ese caso tal como te puse el ejemplo de la fecha.

Un saludo
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Letras "p" Y "z" Minúsculas No Funcionan En Mi Programa 
 
Soplo:

Mil gracias por tu respuesta. Estuve leyendo lo que me explicás, pero a éstas horas (son las 11 en Argentina) ya estoy bastante cansado, asi que la tarea para mañana comprende leer detenidamente tu explicación, que me parece de lo más útil, ya que he descubierto lo dificultoso que es validar campos. Por otro lado, encontré el problema de la P y la Z minúsculas: simplemente en el menú había colocado p y z asociados a una opción sin especificar una combinación de teclas, ejemplo, en lugar de ctrl + p, el menú era activado solamente por la tecla p, lo cual derivaba en que no pudiera escribirla en ninguna parte del formulario principal. Gracias nuevamente, hasta mañana.
 



 
drjuano - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Letras "p" Y "z" Minúsculas No Funcionan En Mi Programa 
 
Míralo bien porque escribir la función es una lata (aunque te puedo dar yo el código de lo que tengo hecho y probablemente con eso te valga) pero cuando eso está hecho tu pones un textbox en el que quieres controlar fechas y le pones el tag a F. Que quieres controlar horas le pones el tag H. Que quieres controlar letras le pones L. Quieres controlar letras y espacios le pones LE. Quieres controlar letras espacios y numeros le pones LNE, quieres controlar valores válidos para un email le pones @ y así para todo. Yo cada vez que me encuentro un caso nuevo le añado la funcioncita y una entrada en el case y ya esá.

Merece la pena.

 
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Letras "p" Y "z" Minúsculas No Funcionan En Mi Programa 
 
Soplo, me fue bastante complicado entender qué es lo que hacías, pero más por mi falta de conocimiento que por otra cosa. Al final de cuentas, comprendí bastante tu idea de no hacerlo tan poco práctico (en el caso mío) y hacerlo un poco más sencillo, te dejo el código de lo que hice:

Éste es el código del módulo "Validar":

PUBLIC PROCEDURE Procesar(Tag AS String, Tecla AS String) AS Boolean
DIM Resultado AS Boolean

IF InStr(Tag, "*") > 0 THEN 'TODO
  Resultado = TRUE
ENDIF

IF InStr(Tag, "N") > 0 THEN 'SOLO NUMEROS
  Resultado = Resultado OR IIf(InStr("123456789", Tecla) > 0, TRUE, FALSE)
ENDIF

IF InStr(Tag, "l") > 0 THEN 'SOLO LETRAS MINÚSCULAS
  Resultado = Resultado OR IIf(InStr("áéíóúüabcdefghijklmnñopqrstuvwxyz", Tecla) > 0, TRUE, FALSE)
ENDIF

IF InStr(Tag, "L") > 0 THEN 'SOLO LETRAS MAYÚSCULAS
  Resultado = Resultado OR IIf(InStr("ÁÉÍÓÚÜABCDEFGHIJKLMNÑOPQRSTUVWXYZ", Tecla) > 0, TRUE, FALSE)
ENDIF

IF InStr(Tag, "O") > 0 THEN 'SOLO OPERADORES
  Resultado = Resultado OR IIf(InStr("+-/*.,", Tecla) > 0, TRUE, FALSE)
ENDIF

IF InStr(Tag, "@") > 0 THEN 'SOLO DIRECCIONES DE EMAIL (SE DEBE USAR CON NUMEROS Y LETRAS MAYUSCULAS Y MINÚSCULAS EN CONJUNTO -lLN-)
  Resultado = Resultado OR IIf(InStr("@._-", Tecla) > 0, TRUE, FALSE)
ENDIF

IF InStr(Tag, "U") > 0 THEN 'SOLO SITIOS WEB (SE DEBE USAR CON NUMEROS Y LETRAS MAYUSCULAS Y MINUSCULAS EN CONJUNTO -lLN-)
  Resultado = Resultado OR IIf(InStr("://.", Tecla) > 0, TRUE, FALSE)
ENDIF

IF InStr(Tag, "#") > 0 THEN 'SOLO NUMEROS CON SEPARADORES DECIMALES Y DE MILES
  Resultado = Resultado OR IIf(InStr("0123456789,.", Tecla) > 0, TRUE, FALSE)
ENDIF
  

IF InStr(Tag, "X") > 0 THEN 'TECLAS OPERACIONALES
  Resultado = Resultado OR IIf(Key.Code = Key.BackSpace, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Tab, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.BackTab, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.CapsLock, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Delete, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Down, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.End, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Enter, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Esc, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Escape, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Home, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Insert, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Left, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Space, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Right, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.Return, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.PageDown, TRUE, FALSE)
  Resultado = Resultado OR IIf(Key.Code = Key.PageDown, TRUE, FALSE)
ENDIF

RETURN Resultado

END


Éste sería el código de un TextBox:

PUBLIC SUB TextBox1_KeyPress()

DIM TeclaValida AS Boolean

TeclaValida = Validar.Procesar(LAST.Tag, Key.Text)

IF TeclaValida = 0 THEN
  STOP EVENT
ENDIF

END


Y en el tag, por ejemplo, pondría para una URL:
TextBox1.tag = "UlLNX"

En X agrupé las teclas, adelante, atrás, PgUp, PgDn, etc.
 



 
drjuano - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Letras "p" Y "z" Minúsculas No Funcionan En Mi Programa 
 
No. No lo has hecho bien y así te va a dar mas trabajo.

Te lo explico despacio no tanto para que lo copies como que lo entiendas. Luego tu copias o lo adaptas a tus gustos.

El código del keypress
Este código coge la tecla pulsada y la evalúa. Si es un código imprimible (letra, numero, espacio, etc) entonces lo evalua con la función VERTECLA. Si es una tecla especial (flechas, enter, backspace, tab, etc entonces lo evalúa con la función VERTECLAESP
public sub txt_keypress()
DIM Valido AS Integer
 IF Key.code < 1000 THEN
   valido = TEC.VerTecla(LAST.tag, Key.Text)
 ELSE
   valido = valido OR TEC.verteclaesp(Key.code)
 ENDIF
 IF valido = 0 THEN
   STOP EVENT
 ENDIF
end

Si tienes en un form diferentes textboxes (o lo que sea) los pones a todos en el mismo grupo y el keypress que sea el del grupo.

Para diferenciar lo que quieres en cada caso utilizas el TAG. Si pones L (en mi caso significa letras, si pones N significa numeros si pones LN significa letras y numeros, todo así.

El código de VerTeclaEsp
Este código es siempre igual en mi caso. Yo siempre quiero admitir el TAB, el backspace, el supr, el enter y las demás ignorarlas. Si te hace falta te pongo el código pero es muy simple. Solo con preguntar si es esta tecla u otra devuelve true o false. Como estas teclas no son imprimibles en vez de recibir como parámetro el text de la tecla pulsada recibe el código de la tecla pulsada.

El código de verTecla
Recebe como parámetro el TAG (osea las teclas que debe permitir) y el text de la tecla pulsada
Solo valida teclas imprimibles por tanto.

Mas o menos es esto
PUBLIC FUNCTION VerTecla(tag AS String, tecla AS String) AS Boolean
DIM Valido AS Boolean = FALSE
IF tag = "*" THEN
 valido = TRUE
 RETURN valido
ENDIF
IF InStr(tag, "L") > 0 THEN
 valido = IIf(Esletra(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "N") > 0 THEN
 valido = valido OR IIf(EsNumero(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "E") > 0 THEN
 valido = valido OR IIf(IsSpace(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "P") > 0 THEN
 valido = valido OR IIf(IsPunct(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "F") > 0 THEN
 valido = valido OR IIf(EsFecha(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "T") > 0 THEN
 valido = valido OR IIf(EsHora(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "C") > 0 THEN
 valido = valido OR IIf(escant(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "@") > 0 THEN
 valido = valido OR IIf(EsEmail(tecla), TRUE, FALSE)
ENDIF
IF InStr(tag, "H") > 0 THEN
 valido = valido OR IIf(EsLink(tecla), TRUE, FALSE)
ENDIF
RETURN valido
END
 

Como ves mira si en el tag está L. En ese caso tiene que evaluar si la tecla pulsada es una letra. Si es así devuelve true y si no false. Si aparece la N entonces evaluará si la tecla pulsada es numero. Si es asi devuelve true y si no false. Imagina que el tag que le has pasado es LNE. Cuando pulsas una tecla el keypress verá si es imprimible o no. Si lo es irá a vertecla con la tecla pulsada y el tag que hemos quedado que es LNE. Según eso evaluará EsLetra y EsNumero y EsEspacio. Si una de las tres es cierta (or) entonces vertecla devolverá true
El código de EsLetra es
private function EsLetra(Tecla as string) as boolean
dim Valido as boolean
if letter(tecla) then
   valido=true
else
   if instr(letra,"ñÑáéíóú")>0 then
      valido=true
   endif
endif
return valido
 

Eso devuelve true si es letra o letra con acentos o ñ

El código de EsNumero es
private function EsNumero(Tecla as string) as boolean
dim Valido as boolean
valido=iif(instr(tecla,"0123456789")>0,true,false)
return valido


El código del espacio es
private function EsEspacio(Tecla as string) as boolean
return isspace(tecla)
 


Para las funciones mas simples puedes acudir a las funciones de gambas
Enlace

todo así.
 



 
última edición por soplo el Sabado, 02 Abril 2011, 19:17; editado 2 veces 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Letras "p" Y "z" Minúsculas No Funcionan En Mi Programa 
 
Soplo:

Genial, ahora comprendo porqué era el ELSE del KeyPress. Ahora comprendo que también estabas contemplando las teclas especiales. Ahora me cierra bien como es tu validación de teclas. Me gustaría saber si la mía, a pesar de que pueda ser un poco más complicada, sería aceptable. Un abrazo. Gracias por tu explicación.
 



 
drjuano - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Letras "p" Y "z" Minúsculas No Funcionan En Mi Programa 
 
No funcionaría por que tu rutina procesar controla las teclas imprimibles y las no imprimibles. Para las imprimibles necesitas mirar el key.text pero para las especiales mirar enviar el key.code. En los parámetros que le pones a la función procesar está tecla as string donde metes el key.text, pero en ninguna parte envias el key.code

Es mejor que el keypress diferencia si es tecla especial o si es tecla normal y la evalúe con su función correpondiente como te puse.

La rutina de evaluar teclas especiales es distinta porque son valores numéricos. Lo que has puesto está bien pero haces muchas operaciones cuando lo puedes hacer en menos. Mira este caso
private function TeclaEsp(Tecla as integer) as boolean
dim Valido as boolean=false
select case tecla
   case key.enter
      valido=true
   case key.return
      valido=true
   case key.backspace
      valido=true
 end select
return valido
end

solo devuelve true si tecla es enter, return o backspace. En otro caso devuelve false

Fíjate que una vez tienes los controles básicos hacer uno complejo es muy simple. Por ejemplo para admitir el dni hay que admitir numero y mayúsculas. Si ya tienes un control para números y otro para mayúsculas hacer una rutina que devuelva true o false según que la tecla sea número, mayúscula u otra cosa es muy simple. Yo tengo opciones para pedir ips o dominios por ejemplo que funcionan perfectamente y solo me cuesta poner el respectivo tag en el textbox o control que sea.

 
 



 
última edición por soplo el Domingo, 03 Abril 2011, 01:59; editado 1 vez 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Letras "p" Y "z" Minúsculas No Funcionan En Mi Programa 
 
soplo, Sos un groso... Justo estaba buscando cómo hacer esto de manera correcta (sólo quiero dejar escribir números, backspace, etc)... y doy con esto. Buenísimo!
 



 
santijav - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 

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