hola!
bueno este codigo surgio para ayudar a un amigo a hacer un filtro en un textbox.. el lo queria para filtrar caracteres para cambiar la clave de windows XP...
es muy simple, basico:
Dim sInclude As String
Private Sub Form_Load()
sInclude = "bcdfghjkmpqrtvwxy2346789"
End Sub
Private Sub Text1_Change()
Dim iTemp As Integer
Dim sLetra As String
Dim sTotal As String
Dim iPos As Integer
Dim bSetNew As Boolean
For iPos = 1 To Len(Text1.Text)
sLetra = Mid(Text1.Text, iPos, 1)
If InStr(1, LCase(sInclude), LCase(sLetra)) > 0 Then
sTotal = sTotal & sLetra
Else
bSetNew = True
End If
Next iPos
If bSetNew Then
iTemp = Text1.SelStart
Text1.Text = sTotal
Text1.SelStart = IIf(iTemp > 0, iTemp - 1, iTemp)
End If
End Sub
espero q sirva de algo, saludos!
tu codigo esta bien pero me parece algo grande y con muchas lineas je mira prueba esto.
Crea un nuevo proyecto y agrega un formulario tantos textobox cuales quieras (este codigo sirve para tantos textbox desees utilizando una clase para ahorrar codigo y no escribir nada de codigo en el formulario ja facil xP)
En una clase llamada: class1
Dim WithEvents TXT As textbox
Public Sub FixString(obj As textbox)
Set TXT = obj
End Sub
Private Sub TXT_KeyPress(KeyAscii As Integer)
If (KeyAscii >= 65 And KeyAscii <= 90) Or (KeyAscii >= 97 And KeyAscii <= 122) Then Exit Sub
KeyAscii = 0
End Sub
Esto en un modulo:
Public AAA As New Class1
Sub main()
Form1.Show
AAA.FixString Form1.Text1
End Sub
Ahora solo configura tu proyecto para que arranque desde el proceso MAIN() que tenemos hubicado en el modulo.
P.D.: se me olvido como usar las propiedades Let y Get en la clases por eso no los puse y use una funcion que de igual forma sirve ja.
No seria mas simple una funcion por ejemplo asi?:
'Por defecto la funcion solo filtra los numeros y el punto '.'
Public Function IsCharacterHere(ByVal sCharacter As String, Optional ByVal bCaseInsensitive As Boolean = False, Optional ByVal sFilter As String = "0123456789.") As Boolean
If sCharacter <> "" Then
If InStr(1, sFilter, sCharacter, IIf(bCaseInsensitive = False, Empty, vbTextCompare)) <> 0 Then
IsCharacterHere = True
End If
End If
End Function
Private Sub Text1_KeyPress(KeyAscii As Integer)
'Solo permite poner las caracteres alfabeticos del teclado... (Es caseInsensitive,da igual minisculas que mayusculas)
If IsCharacterHere(Chr$(KeyAscii), True, "qwertyuiopasdfghjklzxcvbnm") = False Then
KeyAscii = 0
End If
End Sub
Es lo mas corto (y completo) que he tenido tiempo de hacer :P
Saludos :D
gracias por contestar, pero los dos estan equivocados.. lo que ustedes plantean es keypress o keydown, pero se olvidan q alguien puede pegar caracteres y no escribirlos.. ahi esta la diferencia
saludos
xD je hay otra forma me parece que enviandole un mensaje con api pero no recuerdo como era (si es que lo hay o cual me fume?... ya no hay pasto en mi jardin jaja)...¡!
Cita de: el_c0c0 en 5 Noviembre 2008, 01:43 AM
gracias por contestar, pero los dos estan equivocados.. lo que ustedes plantean es keypress o keydown, pero se olvidan q alguien puede pegar caracteres y no escribirlos.. ahi esta la diferencia
saludos
Es cierto :xD, en ese caso tu codigo es funcional :D, pero se puede evitar que se pege o copien cosas en un Texbox, para evitar recorrer toda la cadena cada vez, lo que hace que el programa consuma demasiados recursos (En caso de que la cadena sea largaaaa. :xD)
Saludos ;)