Vos lo que queres seguramente es esto:
Que en el texbox, Nomas se puedan escribir Numeros y/o COMA y/o Punto.
O solo numeros.
Y que cuando escribas te ponga el $ Adelante.
Este es el Algoritmo.
Código:
Option Explicit
Dim posicion As Byte
Private Sub Text1_KeyPress(KeyAscii As Integer)
'If IsNumeric(Chr(KeyAscii)) Or KeyAscii = 8 Or KeyAscii = 44 KeyAscii = 46 Then
If IsNumeric(Chr(KeyAscii)) Or KeyAscii = 8 Then
If KeyAscii = 8 Then
posicion = Text1.SelStart
Else
posicion = Text1.SelStart + 1
End If
Text1 = Mid(Text1, 2, Len(Text1))
Text1 = "$" & Text1
Text1.SelStart = posicion
Else
KeyAscii = 0
End If
End Sub Primero explico algunas cosas para que entiendas.
El Chr(Numero) me devuelve el caracter que represetan el numero en la tabla Ascii.
Ejemplo, Para hacer el @ ARROBa, podes hacer ALT + 64
Ese "64" no es casual, dado que en la tabla ASCII.
http://www.elcodigoascii.com.ar/
De ahi podes ver la tabla Ascii, tenes a la Izquierda el Numero que tiene y al lado el caracter que representa.
- Ahora volviendo sobre el tema.
Si la funcion "Chr" me devolvia el caracter que representa en la tabla ascii, eso quiere decir que si pongo
Chr(64) - Me devuelve "@"
Por cada vez que se aprete un tecla sobre el text1, la variable "KeyAscii" s carga con el valor de la tecla que apretamos, es decir si aprento "A", entonces "KeyAscii" Se carga con "65" que es el numero que tiene en la tabla ascii. A nosotros el "numero" no nos sirve, por ello necesitamos convertirlo nuevamente a su caracter,es decir que "65" pase a valer "A", para esto usamos Chr(KeyAscii)
Ahora tambien esta IsNumeric(Chr(KeyAscii), IsNumeric, lo que hace es fijarse si el valor entre parentesis es NUMERO o LETRA.
Como siempre las funciones se ejecutan desde la de mas adentro hacia la de afuera si apretamos "A", KeyAscii se carga con "65"
Luego Chr(Keyascii), nos devuelve "A".
Ahora el compilador es como que viera con sus "ojos" lo siguente
IsNumeric("A").
En este caso IsNumeric nos devuelve FALSE, proque no es numerico, entonces el IF quedaria algo asi para la "vista" del "compilador"
Código:
If IsNumeric("A") = True Then ....
Else
End If Como Nos devuelve "FALSE" entonces en este caso en concreto iria por el ELSE:
En el ELSE tenemos un KEYASCII = 0
Esto significa que si paso por el IF y fue al ELSE tiene que ser una letra.
Sin embargo nosotros no queremos que se escriban Letras, por ello ponemos KEYASCII=0
Para que Cuando termine en el "END SUB" no escriba NADA, KEYASCII = 0 es lo mismo que ESCRIBIR NADA.
Por lo tanto es como si no hubieramos apretado "A" Código:
Ahora ¿Que pasa si apretabamo "4"?
"4" = 52 en ASCII
Chr(KeyAscii) ----> "4"
---> IsNumeric("4") ---> SI ---> TRUE
If IsNumeric("4") = TRUE Then ....
El IF Tambien tiene un "Or KeyAscii=8" , el "8" es la tecla "BackSpace" o "Borrar" :smile:
Posiblemente si el usuario se equivoca quiera borrar, por lo que tenemos que agregar el "Keyascii=8", dado que "KeyAscii=8" no es un valor Numerico, por lo que pasaria al "KEYASCII=0".
Esto haria como que no hubieramos apretado,la tacla borrar y por ende no se podria borrar los numeros y seria algo muy molesto.
Los KeyAscii = 44 KeyAscii = 46 son para "El punto y la coma", 44 en ASCII es "COMA" y 46 en ASCII es el PUNTO.
Como la coma y punto NO SON numericos, entonces debemos agregarlos con un "Or KeyAscii=44 Or KeyAscii=46".
Como veras te deje, un IF en verde el cual tiene la tilde adelante, para que el compilador "NO LO LEA".
Si embargo si le borras la tilde, lo tenes como opcion
Ahora en este caso entra al IF, el IF tiene lo siguiente:
Código:
If KeyAscii = 8 Then
posicion = Text1.SelStart
Else
posicion = Text1.SelStart + 1
End If
Text1 = Mid(Text1, 2, Len(Text1))
Text1 = "$" & Text1
Text1.SelStart = posicion
EL IF lo que se fija es SI APRETAMOS PRECISAMENTE BORRAR o CUALQUIER otra tecla.
Si apretamos BORRAR (KEYASCII = 8 ) entonces Guarda la posicion actual donde esta el " | " que titila.
Si no, Le suma uno a la posicion
Si borramos por ejemplo ----> "PED
|RO" con la barrita titilando donde yo la puse y borramos la "D" con la tecla BORRAR o BACKSPACE,que esta arriba del ENTER.
Nos queda asi
"PER
|O", Si seguimos borrando nos queda ---> "PER
|", lo cual es muy diferente a cuando borramos normalmente.
Cuando borramos Normalmente hace este efecto.
"PED
|RO" -> "PE
|RO" -> "P
|RO" -"
|RO"
Para obtener este efecto, Guardamos la posicion, dado que si no se mantendria.
Ahora si escribimos normalmente el curso hace esto "P
|" -> "PE
|" -> "PED
|" -> "PEDR
|" -> "PEDRO
|"
Como veras, siempre se suma a UNA POSICION ADELANTE.
Para ello aplicamos el "posicion= text1.SelStart +1"
SelStart es "La posicion donde estara o esta el cursor".
Luego del IF secundario estamo con lo mas importante
[code]
Text1 = Mid(Text1, 2, Len(Text1))
Text1 = "$" & Text1
Text1.SelStart = posicion
[code]
El primer reglon lo que hace es que, tome todo lo que este ignorando el primer caracter.
EJemplo si tenemos "$20000"
Lo que se borra es "$"
Esto lo vamos a hacer, dado que si no lo hacemos, por cada vez que apretemos una tecla, se agrega un "$" entonces si quiero escribir "$200" pasaria lo siguiente.
"$2" -> "$$20" -> "$$$200" cosa que no queremos que pase.
Si el cuadro de texto esta vacio, no pasa nada, dado que la funcion MID lo que hace es:
Mid (PALABRA O VARIABLE A TOMAR
, DESDE QUE POSICION EMPIEZA A LEER , CUANTAS POSICIONES TOMA)
si tenemos "PEDRO" y ponemos "A=MID("PEDRO", 3,2")
"A" tendria a "DRO"
si tenemos "PEDRO" y ponemos "A=MID("PEDRO", 2,3")
"A" tendria a "EDRO"
la Funcion "LEN(TEXTO o VARIABLE)" nos devuelve la CANTIDAD de letras.
"PEDRO" = 5 Letras por lo que :
A=LEN("PEDRO")
"A" tendria "5" ---> A=5
Luego de tomar el valor de por ejemplo "$20" y le vamos a agregar un "0" para que sea "$200"
Entonces tomariamos de "$200" el "200" que empiza desde la posicion o letra en la posicion "2" hasta "la cantidad de letras que resten"(para ello usamos Len(text1).
Esto se lo asignamos al "text1" mismo, Ahora esto tiene un problema.
Cuando hacemos esto el Cursor hace lo siguiente.Se val al FINAL del text1. lo cual, ya tuvimos en cuenta y por ello gurdamos lo posicion en la variable "posicion" (muy original no?)
Entonces recuperamos la posicion de la siguiente manera.
Código:
Text1.SelStart = posicion
Para que no tengas que molestarte en compilar y leer todo.
--------------------------------------------------------------------------------------
Si queres aca tenes el metodo facil..
Descargarlo desde
DOWNLOAD
Y tambien un convertidor de ASCII a NUMERO y de NUMERO a ASCII, para que no tengas que preguntar que valor tiene tal caracter o que caracter represetan tal numero
Convertidor ASCII Y CARACTER
DOWNLOAD
BIEN LOS DEJO ADJUNTOS AL POST, X MEDIO DEL FORO POR SI ALGUN DIA NO ANDAN LOS LINK.
IGUALMENTE LOS LINK DE 4SHARED, CADUCA EL AÑO 2023 EL DIA 9 DE JULIO, ASI QUE ESTARAN FUNCIONANDO X UN PAR DE AÑOS