Validar textbox y MaskEdBox

Tengo un par de problemitas uno es que quiero validar un textbox de la siguiente manera. Quiero ingresar un cedula "8 dígitos" en la caja de texto ya le coloque MaxLength = a 8 máximo, pero también quiero que cuando se haga click en la caja de texto me valide si hay 8 dígitos ingresados yo coloque este código:
Private Sub Text_Cedula_Validated()
If Text_Cedula.MaxLength <= 8 Then
MsgBox "La cedula debe tener 8 Digitos"
Else
End If
End Sub
pero no me hace nada no se que evento utilizar en el texbox!
El otro problemita que tengo es que quiero validar un MaskEdBox con la fecha. Yo ya valide que la fecha sea correcta con esta función:
 Function Age(varBirthDate As Variant) As Integer .... Esta es para el año
       Dim varAge As Variant
      If IsNull(varBirthDate) Then Age = 0: Exit Function
      varAge = DateDiff("yyyy", varBirthDate, Now)
      If Date < DateSerial(Year(Now), Month(varBirthDate), _
                           Day(varBirthDate)) Then
         varAge = varAge - 1
      End If
      Age = CInt(varAge)
    End Function
    Function AgeMonths(ByVal StartDate As String) As Integer..... Y esta es para los meses
      Dim tAge As Double
      tAge = (DateDiff("m", StartDate, Now))
      If (DatePart("d", StartDate) > DatePart("d", Now)) Then
          tAge = tAge - 1
      End If
      If tAge < 0 Then
         tAge = tAge + 1
      End If
      AgeMonths = CInt(tAge Mod 12)
    End Function
y en el evento para validar:
If IsDate(MaskEdBox_naci.FormattedText) = False Then
   'Opcional: podemos mostrar un mensaje
   MsgBox "La Fecha de Nacimiento no es Valida", vbExclamation, "Atencion"
   MaskEdBox_naci.Text = "__/__/____"
   MaskEdBox_naci.SetFocus
   Cancel = True
Else
Todo bien hasta ahí pero quiero que valide con la fecha actual de la pc, es decri que no puede ingresar un fecha que todavía no ha llegado, superior a la actual
esta es una aplicación para mi uni si me puedes ayudar te lo agradecería...

4 Respuestas

Respuesta
1
1) Lo de la validación: A menos que estemos hablando de OTRA versión de Visual Basic, VB6 solo tiene como evento a la expresión "_Validate", o sea que no es "_Validated" con "d" final; quizás esté allí el problema. Para seguir, este evento funciona sobre el control actual, SIEMPRE Y CUANDO al pasar el foco al siguiente control (o sea que debería haber MÁS de uno), éste (el segundo control) tenga su propiedad "CausesValidation" establecida a TRUE. Volviendo al error en el nombre del evento "_Validate", otro indicio para saber que -en vez de elegir el evento en la lista- has escrito tu mismo las sentencias de inicio y fin del evento, es porque en el código que me pasas NO HAY parámetros encerrados en los paréntesis al lado del nombre del evento, ya que el entorno automáticamente los pone, así (de paso presta atención a otros errores que tuviste):
Private Sub TextPreUnit_Validate(Index As Integer, Cancel As Boolean)
   'Si el código para validar determina que el resultado del control NO ES el que esperas, entonces establece el valor de "Cancel" de la siguiente manera:
   If Len(Text_Cedula.Text) <= 8 Then
      'MaxLength es una propiedad que ESTABLECE la cantidad máxima de caracteres, NO ES una propiedad para averiguar la cantidad que TIENE AHORA. En su lugar, para averiguar la cantidad de caracteres usa la función "Len()". NO OBSTANTE, EN ESTE CASO EN PARTICULAR SE HACE INNECESARIA ESTA VALIDACIÓN, PORQUE SI EN LA TABLA DE PROPIEDADES VERDADERAMENTE ESTABLECES UN MÁXIMO EN "MaxLength", entonces sencilla y verdaderamente el control IMPIDE QUE SIGAS INGRESANDO MÁS CARACTERES, GENERALMENTE AVISANDO CON UN PEQUEÑO SONIDO ESTÁNDAR DEL SISTEMA.
      MsgBox "La cedula debe tener 8 Digitos"
      Cancel = True 'Recuerda esto, si es que no se cumple tu condición
   End If
   'Establecer el valor de "Cancel" en TRUE cuando sucede que no se cumple lo que esperabas, impide que el enfoque se vaya del control que se esta validando, y el operador tiene más sencilla la corrección.
End Sub
2) Por otro lado, la manera MÁS SENCILLA de validar una fecha en VB6 es utilizar la función implícita "IsDate" de la siguiente manera:
      If IsDate(MaskEdBoxZ.Text) = False Then
         'acción si es falsa
      Else
         'acción si es verdadera
      End If
Separar la validación, por un lado para los años y por otro lado para los meses NO TIENE SENTIDO, pues la función implícita "IsDate" YA LO HACE. O sea que tienes una redundancia de validación.
3) Finalmente, una función menos compleja para utilizar que "DateSerial", la cual te exige identificar y descomponer día, mes y año, es "DateValue", que permite la asignación de fechas sea desde una cadena de caracteres ("1 de abril de 2010"), hasta un literal de fechas (#01/04/2010#), y para usar en la verificación de SI LA FECHA INTRODUCIDA ES IGUAL O MENOR QUE LA FECHA ACTUAL DEL SISTEMA, esto sería así:
Bueno, PRIMERO verificas si la fecha ES una fecha con "IsDate", porque si directamente utilizas la función "DateValue", y la cadena NO ES una fecha, te dará un error y abortará el programa; luego...
If DateValue(MaskEdBoxZ.Text) <= DateValue(Now) Then
         'acción si es verdadera
End If
Espero haberte sido útil, en todo caso si necesitas mayor información, repregunta por separado para cada uno de los puntos, pues en estos casos suele suceder que nos mareamos al intentar comprender el todo como conjunto.
Antes que nada te doy las gracias por todo. Me funciono la validación de las fechas esta muy bien, pero no me funciono lo de la cedula. ¿No se si fui yo que no entendí muy bien este código va en donde?
Private Sub TextPreUnit_Validate(Index As Integer, Cancel As Boolean)
     If Len(Text_Cedula.Text) <= 8 Then
      MsgBox "La cedula debe tener 8 Digitos"
      Cancel = True 'Recuerda esto, si es que no se cumple tu condición
   End If
End Sub
Por que me diste que la caja de texto es TextPreUnit o va en Text_Cedula. Yo lo coloque en Text_Cedula_Validate pero no hace nada. Eso es lo que no entendí muy bien.!
Primero: La validación POR CÓDIGO de la CANTIDAD MÁXIMA de caracteres del control "Text_Cedula.Text", NO HACE FALTA. Simplemente abre la tabla de propiedades de dicho control en TIEMPO DE EDICIÓN, y fija la propiedad "MaxLength" en la cantidad que necesites, que en tu caso es 8.
Segundo: Lo de "TextPreUnit" fue un furcio mío; justo estaba programando y se me "coló" ese nombre de control que nada tiene que ver con tu código.
Tercero: Sigue válido el Primero; NO UTILICES EL EVENTO "_Validate" para este caso en particular de verificar la cantidad de caracteres del control "Text_Cedula". Es suficiente que asignes la cantidad máxima deseada de caracteres en la propiedad "MaxLength" en la tabla de propiedades. Esa propiedad permite que el usuario ingrese HASTA esa cantidad de caracteres, por ende bien podría poner menos, pero no más ya que el teclado no responde cuando se llega al límite.
Cuarto: El evento "_Validate" sí que es útil para muchos otros casos, PERO NO PARA ESTE EN PARTICULAR cuando intentas verificar la cantidad máxima permitida de caracteres para un control. ¿Para qué hacerlo cuando el entorno de edición de Visual Basic te facilita sobremanera este tipo de validación, SIN NECESIDAD DE PONER CÓDIGO? La propiedad "MaxLength" tiene el comportamiento deseado para el tipo de aplicación profesional que todos los desarrolladores queremos hacer.
¡Ehhhh! Perdón, perdón. Acabo de releer tu pedido y en realidad lo que intentas verificar, APARTE DE IMPEDIR EL INGRESO DE MÁS DE 8 CARACTERES, es que no se pongan menos que esa cantidad.
Ok, ok, estoy superapurado y no medité bien en tu pedido, de todos modos es casi válido el ejemplo de código que te dí:
Private Sub Text_Cedula_Validate(Index As Integer, Cancel As Boolean)
     If Len(Text_Cedula.Text) < 8 Then
      MsgBox "La cédula debe tener exactamente 8 dígitos:" & vbCrLf & "Ni mas ni menos."
Cancel = True 'Recuerda esto, si es que no se cumple tu condición, pues esto devuelve el enfoque al control que está siendo validado, así el operador puede corregir el dato ingresado.
   End If
End Sub
En negrita:
"Text_Cedula" porque yo introduje equivocadamente otro nombre que nada tiene que ver con tu código.
"< 8", porque el signo igual (=) estaba de más, y SIEMPRE daría la advertencia.
"Exactamente" más ' & vbCrLf & "Ni más ni menos."', porque es más comprensible al operador que está manejando tu programa, a quien se recalca la necesidad de ingresar una cédula que SIEMPRE debe tener 8 dígitos.
"vbCrLf", permite el salto de línea en un MsgBox.
Mil perdones, si es que incurrí en provocarte alguna confusión.
No vaciles en pedir más detalles en cuanto a esto. Pero si estás satisfecho, da por terminada la consulta.
Respuesta
1
Que hay
Para el primer problema, porque no pruebas con esto:
if Len(Text_Cedula.Text) <> 8 Then
Para el segundo problema, deja lo estudio porque no he tenido mucho chance de analizarlo bien...
Respuesta
1
Con respecto a la primera pregunta, aquí te dejo el código:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = Asc(Chr(13)) Then
    If Len(Text1.Text) < 8 Then
        MsgBox "La cedula debe tener 8 Digitos"
    End If
End If
End Sub
Con respecto a la segunda, no la entiendo muy bien, podrías explicarte mejor
Respuesta
Para el textbox si quieres podes utilizar if len(text1.text) = 8
len es la función para contar letras.
Después para validar, no den tantas vueltas
Public Function ControlFecha(ByVal fechas As String) As Boolean
 If Not IsDate(fechas) Then
        MsgBox "LA FECHA NO EXISTE!", vbOKOnly + vbCritical, "Control Fechas"
        ControlFecha = True
    End If
End Function
La fecha del sistema es date, esa función te trae la fecha del sistema.
Por ejemplo
If Format(maskfecdiap.Text, "yyyy") <> Format(Date, "yyyy") Then
aca en este if, es si el año ingresado  es distinto al año del sistema.
¿Hay algún evento en el texbox donde pueda validar los 8 dígitos que se ingresan? if len(text1.text) = 8 como por ejemplo keypress o validate. Por que change y click no me sirven.
Si donde vos quieras
Si lo pones en keypress tienes que agregar antes un if keyascii = lateclaausar
Pone keypress igual a enter (13)
Sino en lostfocus, que es cuando pierde el foco...
Pero con enter queda mejor

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas