Noooooo, esa no es la solución que Ximorro te comenta. El te está diciendo que utilices un control checkbox, el cual se crea con la función GUICtrlCreateCheckbox. Mirala en la ayuda.
Esta es una muy buena forma de hacerlo sin complicaciones
.
Otra también facil sería poner un control input (GUICtrlCreateInput) donde se pusiese la fecha cuando le dieses a un control button (un simple botón - GUICtrlCreateButton). El contenido de este control input podría estar al principio en blanco, y una vez le dieses al botón le pasarías el contenido del control dtpicker (la fecha) al control input. Finalmente, lo que se le manda a la base de datos sería el contenido del control input.
Seguro que hay más soluciones fáciles de implementar. Solo hay que ponerse a pensar un poco
.
Y ahora una solución un tanto más dificil (para algunos), pero hace exactamente lo que quieres
.
Código: Seleccionar todo
#include <GuiConstantsEx.au3>
#include <GuiDateTimePicker.au3>
#include <WindowsConstants.au3>
$Debug_DTP = False ; Check ClassName being passed to DTP functions, set to True and use a handle to another control to see it work
Global $hDTP, $aux=True, $hGUI
; Create GUI
$hGUI = GUICreate("(UDF Created) DateTimePick Create", 400, 300)
$hDTP = _GUICtrlDTP_Create($hGUI, 2, 6, 190)
;Otra forma de crear el control dtpicker. Se necesita objener el handle del control para luego poder trabajar con _GUICtrlDTP_SetFormat
;~ $DTP = GUICtrlCreateDate("", 10, 10, 100, 20, $DTS_SHORTDATEFORMAT)
;~ $hDTP=GUICtrlGetHandle($DTP)
; Set the display format
_GUICtrlDTP_SetFormat($hDTP, "'") ;se utiliza la comilla simple para poder poner un campo en blanco, o para poner caracteres que devolverían algo del formato.
;_GUICtrlDTP_SetFormat($hDTP, "Pon aquí la fec'ha") ;Como veis, se puede poner un mensaje en la caja del control.
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR ;, $tInfo
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hDTP
Switch $iCode
Case $DTN_DATETIMECHANGE ; Sent by a date and time picker (DTP) control whenever a change occurs
If $aux Then
_GUICtrlDTP_SetFormat($hDTP, "dd/MM/yyyy")
$aux=False
EndIf
MsgBox(0,"",ControlGetText($hgui,"",$hDTP))
;MsgBox(0,"",GUICtrlRead($DTP)) ;Otra forma de devolver el dato que contiene el control dtpicker cuando se está trabajando con GUICtrlCreateDate
;~ $tInfo = DllStructCreate($tagNMDATETIMECHANGE, $ilParam)
;~ _DebugPrint("$DTN_DATETIMECHANGE" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tInfo, "hWndFrom") & @LF & _
;~ "-->IDFrom:" & @TAB & DllStructGetData($tInfo, "IDFrom") & @LF & _
;~ "-->Code:" & @TAB & DllStructGetData($tInfo, "Code") & @LF & _
;~ "-->Flag:" & @TAB & DllStructGetData($tInfo, "Flag") & @LF & _
;~ "-->Year:" & @TAB & DllStructGetData($tInfo, "Year") & @LF & _
;~ "-->Month:" & @TAB & DllStructGetData($tInfo, "Month") & @LF & _
;~ "-->DOW:" & @TAB & DllStructGetData($tInfo, "DOW") & @LF & _
;~ "-->Day:" & @TAB & DllStructGetData($tInfo, "Day") & @LF & _
;~ "-->Hour:" & @TAB & DllStructGetData($tInfo, "Hour") & @LF & _
;~ "-->Minute:" & @TAB & DllStructGetData($tInfo, "Minute") & @LF & _
;~ "-->Second:" & @TAB & DllStructGetData($tInfo, "Second") & @LF & _
;~ "-->MSecond:" & @TAB & DllStructGetData($tInfo, "MSecond"))
Return 0
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
;~ Func _DebugPrint($s_text, $line = @ScriptLineNumber)
;~ ConsoleWrite( _
;~ "!===========================================================" & @LF & _
;~ "+======================================================" & @LF & _
;~ "-->Line(" & StringFormat("%04d", $line) & "):" & @TAB & $s_text & @LF & _
;~ "+======================================================" & @LF)
;~ EndFunc ;==>_DebugPrint
Explico un poco el rollo, auque lo he comentado bastante bien
.
Con la función _GUICtrlDTP_SetFormat, al principio le pongo un formato vacio en la caja. Esto se consigue gracias a la comilla simple. Gracias a esta función, también podemos poner un mensaje de texto en la caja. Para poder poner caracteres de formato, se debe poner delante de éste la comilla simple.
Utilizo la función GUIRegisterMsg para capturar los mensajes WM_NOTIFY del control dtpicker. Exactamente me interesa el evento que se genera al cambiar el texto del control (la fecha o la hora).
Cuando entramos en la función anterior, la primera vez cambio el formato (en mi caso a fecha corta) del control dtpicker gracias a una variable auxiliar ($aux). Lo he puesto así para que no tenga que estar cambiando el formato siempre que cambias la fecha......aunque si te pones a pensar tampoco pasa nada por eso
.
Y finalmente hago saltar un msgbox con la fecha que se pone cada vez que se cambia.
Si quisieras poner de nuevo el dtpicker en blanco, podrías hacerlo poniendo un botón que te cambiase el formato a vacío. Si haces esto tendrías que cambiar la condición del cambio de formato y en vez de poner una variable auxiliar, deberías de comprobar el contenido del control con ControlGetText o la longitud del string con stringlen (el campo vacio sería longitud 0). Pero si te pones a pensar, puede que ya no merezca nada poner la condición para evitar que cambie el formato continuamente, ya que tienes que llamar a otras funciones para generar esta condición
. Asi que casi mejor la quitas
.
He dejado comentado algo de código para realizar esto creando un control dtpicker con la función GUICtrlCreateDate en vez de con _GUICtrlDTP_Create.
Solamente le veo una pequeña pega sin importancia a este modo de hacer esto
. Que al tener un formato vacio, inicialmente no puede escribir dentro de la caja. Tiene que elegir la fecha desplegando el calendario. Yo no le veo importancia, pero algún titismiquis puede verla
.
Esto último supongo que se podría corregir dándole formato al dtpicker cuando detectase la pulsación de las teclas en el control. Pero como creo que es algo casi sin importancia y lo veo un poco rollo de implementar no lo he hecho
.
He dejado comentada la estructura y sus elementos que consiguen información del control por si la necesitais
. Para ver más sobre esto mirar en la ayuda el ejemplo de la función _GUICtrlDTP_Create.
Espero que os haya gustado
.
Saludos.