• Viernes 29 de Marzo de 2024, 08:09

Autor Tema:  masked + Dtpicker  (Leído 4830 veces)

ycalle

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
masked + Dtpicker
« en: Jueves 27 de Agosto de 2009, 22:28 »
0
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

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: masked + Dtpicker
« Respuesta #1 en: Viernes 28 de Agosto de 2009, 15:52 »
0
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
  1.  
  2. Private Enum DatoFoco
  3.     foco_Nombre = 0
  4.     foco_Fecha = 1
  5.     foco_Socio = 2
  6. End Enum
  7.  
  8. Private p_Fecha As Date
  9. Private p_Nombre As String
  10. Private p_NumeroSocio As Long
  11. Private s_Cambio As Boolean
  12.  
  13. ' lo usamos para que el botón aceptar sepa adónde dirigirse
  14. Private s_Foco As DatoFoco
  15.  
  16.  
  17.  
  18. Private Property Get Nombre() As String
  19.     Nombre = p_Nombre
  20. End Property
  21.     Private Property Let Nombre(ByVal n As String)
  22.         If n <> "" Then
  23.             ' fuerzo formato, por ejemplo mínimo 6 caracteres
  24.             If Len(n) > 5 Then
  25.                 p_Nombre = n
  26.                 s_Cambio = True
  27.             Else
  28.                 MsgBox "El nombre debe tener mínimo 6 caracteres"
  29.             End If
  30.         Else
  31.             MsgBox "El nombre no puede quedar vacío..."
  32.         End If
  33.     End Property
  34.    
  35. Private Property Get NumeroSocio() As Long
  36.     NumeroSocio = p_NumeroSocio
  37. End Property
  38.     Private Property Let NumeroSocio(ByVal n As Long)
  39.         ' limito  a un valor comprendido entre 900 y 4233
  40.         If (n > 899) And (n < 4234) Then
  41.             p_NumeroSocio = n
  42.             s_Cambio = True
  43.         Else  ' no se acepta el cambio
  44.             MsgBox "el número de socio debe estar entre 900 y 4233."
  45.         End If
  46.     End Property
  47.  
  48.  
  49. Private Property Get Fecha() As Date
  50.     Fecha = p_Fecha
  51. End Property
  52.     Private Property Let Fecha(ByVal f As Date)
  53.         ' limito  a un valor a partir de hoy (para probar)
  54.         If DateDiff("d", Now, f) >= 1 Then
  55.             p_Fecha = f
  56.             s_Cambio = True
  57.         Else  ' no se acepta el cambio
  58.             MsgBox "La fecha tiene que ser posterior a hoy."
  59.         End If
  60.     End Property
  61.  
  62. ' asignamos valores iniciales al cargar elformulario
  63. Private Sub Form_Load()
  64.     p_Nombre = "Nombre" ' no queda vacío...
  65.     With TxtDato
  66.         ' nos aseguramos que el ancho del textbox lo es tanto como será el datetimepicker  ' botón del datetimepicker
  67.         .Width = TextWidth(" fechaelegida: domingo 31 de diciembre de 0000 hora: 00:00:00  zzzz")
  68.         .Alignment = vbCenter
  69.         .Text = p_Nombre
  70.         Call DTPicker1.Move(.Left, .Top, .Width, .Height)
  71.     End With
  72.    
  73.     With DTPicker1
  74.         ' 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...
  75.         .MinDate = DateAdd("d", -1, Now)
  76.         .MaxDate = "31 diciembre " & Year(Now)
  77.        
  78.         .Format = dtpCustom ' personalizado                  ' HH formato 24 horas, hh formato 12 horas...
  79.         .CustomFormat = "'Fecha elegida: ' dddd dd MMMM yyy ' Hora: 'HH:mmtt" 'cadena personalizada dentro del formato entre comillas simples
  80.         ' otro ejemplo de formato personalizado... campos de fecha separada por _-_ y hora entre corchetes, mostrando segundos.
  81.         '.CustomFormat = "'sólo éste año: ' dd'_-_'mm'_-_'yyy '   ['hh:mm:sstt']'"
  82.     End With
  83.     Me.Show
  84.     p_Fecha = Now
  85.     p_NumeroSocio = 1200 ' por ejemplo
  86.     s_Foco = foco_Nombre
  87.     CambiarVisibles ' oculta el timepicker y muesta el textbox
  88.     ComNombre.SetFocus
  89. End Sub
  90.  
  91.  
  92.  
  93. Private Sub ComNombre_Click()
  94.     TxtDato.Text = Nombre
  95.     s_Foco = foco_Nombre
  96.     CambiarVisibles
  97. End Sub
  98.  
  99. Private Sub ComNumSocio_Click()
  100.     TxtDato.Text = NumeroSocio
  101.     s_Foco = foco_Socio
  102.     CambiarVisibles
  103. End Sub
  104.  
  105. Private Sub ComFecha_Click()
  106.     DTPicker1.Value = p_Fecha
  107.     s_Foco = foco_Fecha
  108.     CambiarVisibles
  109. End Sub
  110.  
  111. Private Sub ComAceptar_Click()
  112.     Select Case s_Foco
  113.         Case DatoFoco.foco_Nombre
  114.             Nombre = TxtDato.Text ' valida la entrada del dato
  115.             TxtDato.Text = Nombre ' devuelve el valor validado
  116.         Case DatoFoco.foco_Socio
  117.             NumeroSocio = TxtDato.Text ' valida la entrada del dato
  118.             TxtDato.Text = NumeroSocio ' devuelve el valor validado
  119.         Case DatoFoco.foco_Fecha
  120.             Fecha = DTPicker1.Value  ' valida la entrada del dato
  121.             DTPicker1.Value = Fecha  ' devuelve el valor validado
  122.     End Select
  123. End Sub
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130. ' 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)
  131. Private Sub CambiarVisibles()
  132.     'TxtDato.Visible = (s_Foco <> foco_Fecha)
  133.     DTPicker1.ZOrder (1 And (s_Foco <> foco_Fecha)) 'TxtDato.Visible)  ' sube a primer plano o lo manda debajo del textbox
  134. End Sub
  135.  
  136. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  137.     If s_Cambio = True Then
  138.         ' han cambiado los valores de al menos una propiedad...
  139.         ' si se usa una base de datos sería indicativo de guardar cambios antes de salir
  140.         If MsgBox("Han cambiado datos de algunos campos, desea guardarlos a la base de datos?.", vbInformation + vbYesNo, "Guardar cambios....?") = vbYes Then
  141.             ' guardar cambios en la base de datos
  142.             '     .........
  143.         Else
  144.             MsgBox "Los cambios realizados han sido desestimados..."
  145.         End If
  146.        
  147.     End If
  148. End Sub
  149.  
  150.  

Si alguna parte no la entiendes  avisa...
« última modificación: Domingo 13 de Septiembre de 2009, 06:51 por Nebire »
«Ma non troppo»
----> ModoVacaciones = False<----

ycalle

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: masked + Dtpicker
« Respuesta #2 en: Viernes 28 de Agosto de 2009, 16:58 »
0
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

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: masked + Dtpicker
« Respuesta #3 en: Sábado 29 de Agosto de 2009, 09:36 »
0
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
  1.  
  2.        .Format = dtpCustom ' personalizado                  ' HH formato 24 horas, hh formato 12 horas...
  3.      .CustomFormat = "'Fecha elegida: ' dddd dd MMMM yyy ' Hora: 'HH:mmtt" 'cadena personalizada dentro del formato entre comillas simples
  4.  
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
  1.  
  2. Private Property Let Fecha(ByVal f As Date)
  3.         If DateDiff("d", Now, f) >= 1 Then
  4.             p_Fecha = f
  5.             s_Cambio = True
  6.         Else  ' no se acepta el cambio
  7.            MsgBox "La fecha tiene que ser posterior a hoy."
  8.             DTPicker1.setfocus        ' <==================================================== éste esel cambio introducido ===================================
  9.        End If
  10.     End Property
  11.  
  12.  
  13.  
«Ma non troppo»
----> ModoVacaciones = False<----