Sábado 21 de Diciembre de 2024, 10:48
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
Visual Basic 6.0 e inferiores
»
Visual Basic para principiantes
(Moderador:
F_Tanori
) »
masked + Dtpicker
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: masked + Dtpicker (Leído 4949 veces)
ycalle
Nuevo Miembro
Mensajes: 2
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
,
Tweet
Nebire
Miembro HIPER activo
Mensajes: 670
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
Private
Enum
DatoFoco
foco_Nombre = 0
foco_Fecha = 1
foco_Socio = 2
End
Enum
Private
p_Fecha
As
Date
Private
p_Nombre
As
String
Private
p_NumeroSocio
As
Long
Private
s_Cambio
As
Boolean
' lo usamos para que el botón aceptar sepa adónde dirigirse
Private
s_Foco
As
DatoFoco
Private
Property
Get
Nombre()
As
String
Nombre = p_Nombre
End
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_NumeroSocio
End
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_Fecha
End
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 elformulario
Private
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.SetFocus
End
Sub
Private
Sub
ComNombre_Click()
TxtDato.Text = Nombre
s_Foco = foco_Nombre
CambiarVisibles
End
Sub
Private
Sub
ComNumSocio_Click()
TxtDato.Text = NumeroSocio
s_Foco = foco_Socio
CambiarVisibles
End
Sub
Private
Sub
ComFecha_Click()
DTPicker1.Value = p_Fecha
s_Foco = foco_Fecha
CambiarVisibles
End
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
Select
End
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 textbox
End
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
If
End
Sub
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
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
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
.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
«Ma non troppo»
----> ModoVacaciones = False<----
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
Visual Basic 6.0 e inferiores
»
Visual Basic para principiantes
(Moderador:
F_Tanori
) »
masked + Dtpicker