como filtrar caracteres en un texto (snippet)

Iniciado por el_c0c0, 3 Noviembre 2008, 00:01 AM

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

el_c0c0

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:
Código (vb) [Seleccionar]

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!
'-     coco
"Te voy a romper el orto"- Las hemorroides

BlackZeroX

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

Código (vb) [Seleccionar]

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:

Código (vb) [Seleccionar]

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.
The Dark Shadow is my passion.

Karcrack

#2
No seria mas simple una funcion por ejemplo asi?:
Código (vb) [Seleccionar]
'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

el_c0c0

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
'-     coco
"Te voy a romper el orto"- Las hemorroides

BlackZeroX

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)...¡!
The Dark Shadow is my passion.

Karcrack

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 ;)