Programación General > Visual Basic para principiantes

 masked + Dtpicker

(1/1)

ycalle:
Buenas compañeros,

no soy un duro en Visual Basic 6, pero les tengo una pregunta, tengo un campo que se llama "FEC_NACI" que relaciona la fecha de nacimiento, y lo trabajo con el MaskedBox, para darle un formato " ####-##-##", y que cuando creo un nuevo registro, siempre me queda en blanco, lo hago para no generarle problema al usuario, pero quisiera colocarle un Boton al lado y que el me abra un dtpicker y cuando lo cierra coloque la fecha en el MaskedBox, que selecciono,

necesito urgente que me ayuden o me indiquen que hay que hacer para lograr ser mas optimo, por me enseñaron un truco, con el dtpicker, colocándole un texto encima y activandolo para cuando se encuentre el registro, para  mi, no tiene sentido, es muy tedioso hacerlo, pero no me gusta, por eso hago ese pregunta, porque eso seria mas programacion que trucos.

griacias de antemano para quien me pueda ayudar y se me puediera regalar algun codigo, sea asi de algun formulario con muchas funciones y controles,ademas, estoy trabajando con MySql

mi correo es  yesidcallegonzalez@gmail.com,

Nebire:
Te voy a responder de un modo un poco abstracto, ya que lo que dices que realmente quieres es ser más óptimo.... no manifiestas claramente si tienes un problema y cual es...

Cuando tienes que manejar variables que deban cumplir ciertos requisitos hay dos formas de controlarlas adecuadamente con VB6.

1 -  Si los valores proceden de entrada del usuario (pior ejemplo un textbox), es útil usar el evento validate de los controles (la propiedad causesvalidation debe estar establecida a True).
   
2 - Utilizar propiedades: al utilizar propiedades tienes la oportunidad de dar formato espécifico y controlar el contendio de un valor. Esto es más útil que usar el evento validate, en muchos casos, por ejemplo imagina que utilizas un único textbox para las entradas del usuario y es un botón distinto el que se encarga de indicar que dato es el que se modifica...

Sobre el evento validate y dar formato  se ha hablado bastante en los foros, puedes hacer una búsqueda, yo te señalo por ejemplo este hilo: viewtopic.php?f=143&t=39214&p=142589&hilit=Format#p142589

Y para comentar sobre las propiedades un pequeño ejemplo de código....
coloca 4 botones, un textbox y un datetimepicker, renómbralos así:
el textbox: txtDato ; boton1 : ComNombre ; boton2 ComSocio; boton3: ComFecha; boton4: ComAceptar ; el datetimepicker: DTPicker1,  los caption para poner a los botones se deducen de sus nombres....

--- Código: Visual Basic --- Private Enum DatoFoco    foco_Nombre = 0    foco_Fecha = 1    foco_Socio = 2End Enum Private p_Fecha As DatePrivate p_Nombre As StringPrivate p_NumeroSocio As LongPrivate s_Cambio As Boolean ' lo usamos para que el botón aceptar sepa adónde dirigirsePrivate s_Foco As DatoFoco   Private Property Get Nombre() As String    Nombre = p_NombreEnd Property    Private Property Let Nombre(ByVal n As String)        If n <> "" Then            ' fuerzo formato, por ejemplo mínimo 6 caracteres            If Len(n) > 5 Then                p_Nombre = n                s_Cambio = True            Else                MsgBox "El nombre debe tener mínimo 6 caracteres"            End If        Else            MsgBox "El nombre no puede quedar vacío..."        End If    End Property    Private Property Get NumeroSocio() As Long    NumeroSocio = p_NumeroSocioEnd Property    Private Property Let NumeroSocio(ByVal n As Long)        ' limito  a un valor comprendido entre 900 y 4233        If (n > 899) And (n < 4234) Then            p_NumeroSocio = n            s_Cambio = True        Else  ' no se acepta el cambio            MsgBox "el número de socio debe estar entre 900 y 4233."        End If    End Property  Private Property Get Fecha() As Date    Fecha = p_FechaEnd Property    Private Property Let Fecha(ByVal f As Date)        ' limito  a un valor a partir de hoy (para probar)        If DateDiff("d", Now, f) >= 1 Then            p_Fecha = f            s_Cambio = True        Else  ' no se acepta el cambio            MsgBox "La fecha tiene que ser posterior a hoy."        End If    End Property ' asignamos valores iniciales al cargar elformularioPrivate Sub Form_Load()    p_Nombre = "Nombre" ' no queda vacío...    With TxtDato        ' nos aseguramos que el ancho del textbox lo es tanto como será el datetimepicker  ' botón del datetimepicker        .Width = TextWidth(" fechaelegida: domingo 31 de diciembre de 0000 hora: 00:00:00  zzzz")        .Alignment = vbCenter        .Text = p_Nombre        Call DTPicker1.Move(.Left, .Top, .Width, .Height)    End With        With DTPicker1        ' 1 día menos que hoy, lo hacemos a propósito para poder elegir una fecha menor y ver como la propiedad no deja cambiarlo...        .MinDate = DateAdd("d", -1, Now)        .MaxDate = "31 diciembre " & Year(Now)                .Format = dtpCustom ' personalizado                  ' HH formato 24 horas, hh formato 12 horas...        .CustomFormat = "'Fecha elegida: ' dddd dd MMMM yyy ' Hora: 'HH:mmtt" 'cadena personalizada dentro del formato entre comillas simples        ' otro ejemplo de formato personalizado... campos de fecha separada por _-_ y hora entre corchetes, mostrando segundos.        '.CustomFormat = "'sólo éste año: ' dd'_-_'mm'_-_'yyy '   ['hh:mm:sstt']'"    End With    Me.Show    p_Fecha = Now    p_NumeroSocio = 1200 ' por ejemplo    s_Foco = foco_Nombre    CambiarVisibles ' oculta el timepicker y muesta el textbox    ComNombre.SetFocusEnd Sub   Private Sub ComNombre_Click()    TxtDato.Text = Nombre    s_Foco = foco_Nombre    CambiarVisiblesEnd Sub Private Sub ComNumSocio_Click()    TxtDato.Text = NumeroSocio    s_Foco = foco_Socio    CambiarVisiblesEnd Sub Private Sub ComFecha_Click()    DTPicker1.Value = p_Fecha    s_Foco = foco_Fecha    CambiarVisiblesEnd Sub Private Sub ComAceptar_Click()    Select Case s_Foco        Case DatoFoco.foco_Nombre            Nombre = TxtDato.Text ' valida la entrada del dato            TxtDato.Text = Nombre ' devuelve el valor validado        Case DatoFoco.foco_Socio            NumeroSocio = TxtDato.Text ' valida la entrada del dato            TxtDato.Text = NumeroSocio ' devuelve el valor validado        Case DatoFoco.foco_Fecha            Fecha = DTPicker1.Value  ' valida la entrada del dato            DTPicker1.Value = Fecha  ' devuelve el valor validado    End SelectEnd Sub      ' cuando elegimos un botón traemos al frente o debajo el timepicker sobre el textbox.... es decir ocultamos el que no se va a utilizar, debajo del otro(los hicimos del mismo tamaño ubicados en la misma posición)Private Sub CambiarVisibles()    'TxtDato.Visible = (s_Foco <> foco_Fecha)    DTPicker1.ZOrder (1 And (s_Foco <> foco_Fecha)) 'TxtDato.Visible)  ' sube a primer plano o lo manda debajo del textboxEnd Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)    If s_Cambio = True Then        ' han cambiado los valores de al menos una propiedad...        ' si se usa una base de datos sería indicativo de guardar cambios antes de salir        If MsgBox("Han cambiado datos de algunos campos, desea guardarlos a la base de datos?.", vbInformation + vbYesNo, "Guardar cambios....?") = vbYes Then            ' guardar cambios en la base de datos            '     .........        Else            MsgBox "Los cambios realizados han sido desestimados..."        End If            End IfEnd Sub  
Si alguna parte no la entiendes  avisa...

ycalle:
buenos días Nebire.
Gracias por la explicación que me das, y voy validar el código que me enviaste y te comento, aunque no fui muy claro en el problema que tengo, voy hacer mas especifico. mira,

tengo un campo de maskedBox.texto que le di el formato de fecha '####/##/##", año, mes y día, bueno, hasta ahi esta bien, y cada vez que limpio los campo lo inicializo y lo dejo en blanco, pero anteriormente tenia un Dtpicker1, pero lo que no me gustaba era que siempre que arranca el formulario, aparece una fecha por default, y como no se puede poner en blanco por eso utilizo en el campo que texto que te mencione, entonces, quiero tratar de colocar un botón al lado, que el presionar click en el botón active el dtpicke1 y muestre la ventana de calendario, escoja la fecha y cuando se cierre coloque el fecha en el texto.

Fecha de Nacimiento : ___ /__ /__    | .. |                    

no se si me explique,

de todas formas gracias, voy a revisar tu codigo.
Saludos

Nebire:
Ahora ha quedado más claro...

Te comento. Efectivamente el datetimepicker no puede quedar vacío, puesto que maneja fechas al dejarlo vacío correría el riesgo de introducirse algo no válido con lo que devolvería datos erróneos, elmodo de asegurarse que siempre contiene un dato válido de fecha es que siempre tenga una fecha. Pero esto no significa que no pueda 'quedar vacío'. quedar vacío desde el punto de vista de un programador es más que nada conocer con exactitud el contenido de un dato, el cual puede considerarse descartable...

Por ejemplo supongamos que se ha de introducir una fecha del año que viene, entonces podrías poner la fecha mínima del datetimepicker al 31 de diciembre de esteaño, la cual puede considerarse el dato vacío, de modo que cuando el usuario acepte el dato comprobamos la fecha si es el 31 de diiiciembre de éste año 'sabemos' que el usuario ha dejado el campo vacío. Ahora eres tú quien debe decidir que fecha se coloca cuando el usuario deja el campo vacío, le podemos o bien  en el evento validate del dtpicker, cancelar, lo cual regresa el foco al control, mostrándole antes que debe elegir una fecha en el rango que entiedes debe ser aceptado.

El datetimepicker, permite formatear completamente sus campos, de hecho si ejecutaste el ejemplo de más arriba verás en el load del formulario que le doyformato al control con estas 2 líneas:

--- Código: Visual Basic ---        .Format = dtpCustom ' personalizado                  ' HH formato 24 horas, hh formato 12 horas...      .CustomFormat = "'Fecha elegida: ' dddd dd MMMM yyy ' Hora: 'HH:mmtt" 'cadena personalizada dentro del formato entre comillas simples El control maskedtext, va pien para otros tipos de datos, normalmente cadenas de texto complejas, pero aquí dado que además de poder formatear el texto, el dtpicker permite al usuario elegir una fecha con una gran comodidad, no está justificada la presencia del control Maskedtext. Otra gran ventaja del control Datetimepicker respecto del maskedtext es que el datetimepicker, permite fijar una fecha mínima y una fecha máxima, esto significa 2 cosas, para empezar el calendario no avanzará ni más allá de la fecha max ni más acá dela fecha min, y en el supuesto que el mes entrado, la fecha elegida (el día) sea menor que el mínimo muestra un mensaje de fecha no permitida. Esto te ahorra bastante trabajo sobre el maskedtext, pués con éste tendrías que verificar que la fecha que el usuario introduce a mano no es de cuanto Cristo se fue al desierto, o de cuando Deckard atrapa al último replicante.

El cóodigo que te mostré arriba, tiene bastante 'sustancia' por lo que yo te aconsejo que lo estudies hasta que lo compendas totalmente.... lo único que no hacemos y que se podría añadir es derivar el foco nuevamente cuando el cambio de propiedad no se produce...
Haciendo esos cambios mencionados (sólo te lo pongo en la propiedad fecha sería equivalente el cambio en las otras 2 propiedades) el código quedaría:

--- Código: Visual Basic --- Private Property Let Fecha(ByVal f As Date)        If DateDiff("d", Now, f) >= 1 Then            p_Fecha = f            s_Cambio = True        Else  ' no se acepta el cambio            MsgBox "La fecha tiene que ser posterior a hoy."            DTPicker1.setfocus        ' <==================================================== éste esel cambio introducido ===================================        End If    End Property   

Navegación

[0] Índice de Mensajes

Ir a la versión completa