Ver Mensaje Individual
  #4 (permalink)  
Antiguo 09/05/2008, 03:26
Avellaneda
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Re: Ingresar en cuadro de texto solo numeros y signos

Hola, prueba con una función así:

Código:
Function VerificaNum(ByVal Texto As String, Tecla As Integer) As Integer
Dim iValor As Integer, iLen As Integer

iValor = Tecla      ' valor Keyascii que devolverá la función
iLen = Len(Texto)   ' longitud del texto según se escribe
' el primer carácter sólo puede ser "+" 0 "-"
If iLen = 0 And (Chr(Tecla) <> "+" And Chr(Tecla) <> "-") Then
    VerificaNum = 0
    Exit Function
End If
' sólo permitimos números, punto, coma y retroceso
If InStr("0123456789.," & Chr(8), Chr(iValor)) = 0 Then iValor = 0
' comprueba que el signo menos esté sólo al principio
If Chr(Tecla) = "-" Or Chr(Tecla) = "+" Then
    If InStr(2, "-", Texto) > 0 Or InStr(2, "+", Texto) > 0 Then iValor = Tecla
End If
' si la tecla pulsada es la coma, la convertimos a punto ya que al hacer
' los cálculos, la función Val() sólo reconoce el punto como separador decimal
If iValor = 44 Or iValor = 46 Then
    iValor = 46
    ' si ya se ha escrito un separador decimal, no se permite otro
    If (InStr(Texto, ".") > 0 Or InStr(Texto, ",") > 0) Then iValor = 0
End If
If InStr(Texto, ".") > 0 Then
    ' tenemos el separador decimal, comprobar si es el primer o segundo dígito
    iLen = Len(Mid(Texto, InStr(Texto, "."), Len(Texto)))
    If iLen = 1 And InStr("0257" & Chr(8), Chr(iValor)) > 0 Then
        ' para el primer decimal sólo 0, 2, 5 y 7
        iValor = Tecla
    ElseIf iLen = 2 And InStr("05" & Chr(8), Chr(iValor)) > 0 Then
        ' para el segundo sólo 0 y 5
        iValor = Tecla
    Else
        ' no permite más de dos decimales
        iValor = 0
    End If
End If
VerificaNum = iValor
End Function

La llamas desde el evento KeyPress pasándole como parámetros el texto excrito y la tecla pulsada

Código:
Private Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = VerificaNum(Text1.Text, KeyAscii)
End Sub
Nota: No la he probado a fondo, pero creo que contempla todas las casuísticas que indicas.

Un saludo.