manera de operar con funciones

Iniciado por fraktal, 16 Septiembre 2006, 21:09 PM

0 Miembros y 1 Visitante están viendo este tema.

fraktal

Hola, aber, resulta que estoy haciendo unas pruebas y me encuentro con un problema. Yo vengo de programar en Visual Lisp. Ahi, se puede operar de una manera tal, que para yo puedo agrupar muchas funciones y obtener un solo resultado. Pongamos por caso que yo quiero en Visual Lisp decir que si una tecla es pulsada en minuscula, me de el resultado en mayuscula. Yo lo haria asi:
(setq letra (strcase (chr 97)))
esto en VL se ejecuta por parentesis de dentro hacia fuera. El 97 representa la letra a pulsada en este caso, entonces primero transformaria ese codigo ascii en letra, y despues con strcase la pone en mayuscula, y lo guarda en la variable Letra. Con lo cual ese es el resultado final "A" y he agrupado dos funciones Strace y Chr para obtener la "A" viniendo de "a".
Bien, ahora me planteo que estoy en visual basic. Creo un textbox. Y mi objetivo que cuando se escriba sobre el, transforme esa letra automaticamente en mayuscula, mediante el evento Keydown. Bien, empleando la tecinca de visual lisp puse esto:
Text9.Text = UCase(Chr(KeyCode))
pensando que se procesiarai primero el chr (keycode)
y transformaria el codigo ascii que recibe de la letra a caracter, y luego lo pasaria por el Ucase que lo pone en mayuscula, pero a la hora d ejecutar el programa, escribo y me devuelve la letra que he pulsado en minuscula y mayuscula, con lo cual deduzco que lo que pasa es que da como resultado las dos funciones que he empleado, una me devuelve la letra pulsada osea que chr (keycode) y luego el Ucase. De manera que como haria yo, o cual es la forma mas rapida y practica de hacer esto. Entiendo que podria crear una variable, ejecutar primero el chr guardarlo en la variable y volver a ejecutar el ucase para que lo vuelva a guardar en la variable no? pero no kreo que sea la forma mas rapida. No se... alguien me ayuda? y sobre todo que me digan cual es la forma de agrupar varias funciones para que obtenga un resultado, si es posible. Gracias y saludos.


soplo

Hola
Si pruebas a pulsar la tecla 'a' en un textbox verás que en el evento keydown se guarda en la variable keycode el valor 67 que se corresponde con A, en cambio en el evento keypress se guarda en la variable keyascii el valor 'a' que es el que pulsaste.

Esto es porque keydown y keyup miran que tecla física se ha pulsado mientras que keypress miran que caracter has pulsado y no es lo mismo. Por eso en keypress no puedes controlar las teclas F!...F12, los control, los shift, los alt, ... porque no tienen correspondencia con ningún caracter.

CitarPongamos por caso que yo quiero en Visual Lisp decir que si una tecla es pulsada en minuscula, me de el resultado en mayuscula. Yo lo haria asi:
(setq letra (strcase (chr 97)))
pues aquí haces
sub keypress(keyascii as integer)
keyascii=asc(ucase(chr(keyascii)))
end sub


Esto hace lo siguiente
en keyascii hay un código ascii.
Con chr(keyascii) obtengo el caractar correspondiente ('a')
con ucase('a') obtengo ese caracter en mayúsculas ('A')
con asc('A') obtengo el código ascii de lo obtenido (65)
así que cuando entré keyascii era 97 ('a') y al salir es 65 ('A')

Un saludo
Callar es asentir ¡No te dejes llevar!

fraktal

OK, gracias Soplo, ya lo he entendido. Me ha costado pq yo hacia lo que tu decias y luego añadia
text1.text = keyascii y me seguia dando el mismo problema. El asunto es que aun sin entender pq, no ahi que ponerle al texto del la caja el keyascii pq ahi es cuando lo repite. Digo que no entiendo pq, pues y Keyascii tiene un valor en el momento de transformalo a mayuscula, y yo añado ese valor al text1.text deberia la propiedad text tomar ese valor, osea una letra, no se pq lo repite y me pone el kodigo ascii y la tecla ya transformada. Entonces bueno entiendo que cuando simplemente por pulsar la tecla, saltar el procedimiento, como el Keyascii se pasa como argumento al procedimiento, este se modifica y ya esta... tiene es que ver con lo de pasar un argumento por referencia y por valor? Hasta el momento he leido sobre ello, pero todavia no me he encontrado con un caso practico. Gracias y saludos.

soplo

Hola
Citarluego añadia
text1.text = keyascii y me seguia dando el mismo problema. El asunto es que aun sin entender pq, no ahi que ponerle al texto del la caja el keyascii pq ahi es cuando lo repite.
Cuando profundices mas verás que puedes construir clases. Una clase es un conjunto de código que puede hacer muchas cosas (entre ellas un objeto) y definir sus propiedades y eventos.

Cuando tu inicias vb te vienen hechas unas clases (la clase form, la clase textbox, la clase label, ...) que tienen ya unas propiedades intrínsecas.

De esta forma tu puedes hacer tu propia clase y crear tus propios objetos con las propiedades y comportamiento que tu quieras, si usas un objeto de una clase ya existente este tendrá sus propiedades y tu tendras que aceptarlas o no usarlo.

El objeto textbox tiene varios eventos programados. Uno de ellos es el keypress que recoge el valor ascii de la tecla pulsada y lo agrega al resultado. Por eso tu no tienes que hacer text1=keyascii, porque ya lo hace él. Tu solo tienes que validar el código (o transformarlo) sabiendo que cuando salga será agregado (a menos que keyascii sea 0).

El control textbox funciona así y así tendrás que aceptarlo. Si quieres cambiarlo eres libre de hacer otra clase con otras propiedades y eventos que se comporten de distinta forma.

Un saludo
Callar es asentir ¡No te dejes llevar!

fraktal

Gracias, ya entiendo mejor. Saludos.