Что нового

[Элементы GUI] "Перескакивание" со дня на месяц в GUICtrlCreateDate

YOgen

Знающий
Сообщения
58
Репутация
5
Есть ли возможность реализовать так называемое "перескакивание" со дня на месяц (с месяца на год) при вводе значений?
К примеру, надо ввести дату 21.12.2012: набираю две цифры числа (21), автоматически перескакивает на ввод месяца и т.д.
Код:
GUICtrlCreateDate ('', 5,5, 90,24, $DTS_SHORTDATEFORMAT)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
YOgen
Стрелки не подходят? Как определить когда перескакивать после ввода 2 или после ввода 24?
 
Автор
YOgen

YOgen

Знающий
Сообщения
58
Репутация
5
AZJIO,
Стрелки - это дополнительное телодвижение :smile:
Требуется "перепрыгивание" после введения 2 символов в значении числа (если 24, то после того как нажали 2, а потом 4... если надо 3-е число вбить - после нажатия 0, а после 3), 2-х - в месяце и 4-х в году.
Надеюсь боль-мень понятно объяснил :whistle:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
YOgen
Готовый пример не дам, но смотрите _GUICtrlDTP_Create, там при изменении приходит событие $DTN_DATETIMECHANGE, по крайней мере можно эмулировать снажатие стрелки вправо с помощью ControlSend.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Сделано по мотивам конкурса http://autoit-script.ru/index.php/topic,9264.0.html
(во у меня память ;D)

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>

Global $oMyError

Example()

Func Example()


    GUICreate("My GUI edit") 

	$myedit1 = GUICtrlCreateInput("", 176, 32, 30, 20,$ES_NUMBER)
	GUICtrlSetLimit(-1, 2)
	$myedit2 = GUICtrlCreateInput("", 236, 32, 30, 20,$ES_NUMBER)
	GUICtrlSetLimit(-1, 2)
	$myedit3 = GUICtrlCreateInput("", 296, 32, 60, 20,$ES_NUMBER)
	GUICtrlSetLimit(-1, 4) 


    GUISetState()
   
    While 1
        $msg = GUIGetMsg()
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop

		If ControlGetFocus("") = "Edit1" Then
			If StringLen(GUICtrlRead($myedit1)) = 2 Then ControlFocus("","",$myedit2)
		EndIf

		If ControlGetFocus("") = "Edit2" Then
			If StringLen(GUICtrlRead($myedit2)) = 2 Then ControlFocus("","",$myedit3)
		EndIf

    WEnd

    GUIDelete()
EndFunc   ;==>Example
 

XpycT

Скриптер
Сообщения
380
Репутация
133
C2H5OH
Вот еще вариант
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>

$hApp = GUICreate("My GUI edit")

$Date_D = GUICtrlCreateInput("", 176, 32, 30, 20,$ES_NUMBER)
GUICtrlSetLimit($Date_D, 2)
$Date_M = GUICtrlCreateInput("", 236, 32, 30, 20,$ES_NUMBER)
GUICtrlSetLimit($Date_M, 2)
$Date_Y = GUICtrlCreateInput("", 296, 32, 60, 20,$ES_NUMBER)
GUICtrlSetLimit($Date_Y, 4)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState()

While 1
    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then Exit
WEnd

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit

    Local $hDate_D = $Date_D, $hDate_M = $Date_M

    If Not IsHWnd($hDate_D) Then $hDate_D = GUICtrlGetHandle($hDate_D)
    If Not IsHWnd($hDate_M) Then $hDate_M = GUICtrlGetHandle($hDate_M)

    $hWndFrom = $ilParam
    $iIDFrom = _WinAPI_LoWord($iwParam)
    $iCode = _WinAPI_HiWord($iwParam)

    Switch $iCode
        Case $EN_CHANGE ; Sent when the user has taken an action that may have altered text in an edit control
            Switch $hWndFrom
                Case $hDate_D
                    If StringLen(GUICtrlRead($Date_D)) = 2 Then GUICtrlSetState($Date_M, $GUI_FOCUS)

                Case $hDate_M
                    ConsoleWrite("$hWndFrom = " & $hWndFrom & " | $hDate_M = " & $hDate_M & @CR)
                    If StringLen(GUICtrlRead($Date_M)) = 2 Then GUICtrlSetState($Date_Y, $GUI_FOCUS)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
YOgen

YOgen

Знающий
Сообщения
58
Репутация
5
C2H5OH, XpycT,
Спасибо, интересные варианты.

AZJIO,
а можно по-подробнее, пжлста, про $DTN_DATETIMECHANGE. А то что-то ни в справке, ни на форуме ничего не нашел по этому поводу.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
YOgen
Скачивай UDFs3.chm отсюда и на вкладке "Указатель" вставляй "_GUICtrlDTP_Create" и жми Enter. Там описание и пример.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
YOgen [?]
а можно по-подробнее, пжлста, про $DTN_DATETIMECHANGE
Попробуйте примерно так.
Код:
#include <GUIConstantsEx.au3>
#include <DateTimeConstants.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>

Global $aDate[4] = ['01', '01', '2010']

$hGUI = GUICreate('Test', 200, 200, -1, -1)
$nDate = GUICtrlCreateDate(StringFormat('%04d/%02d/%02d', $aDate[2], $aDate[1], $aDate[0]), 10, 10, 180, 20, $DTS_SHORTDATEFORMAT)
$nLabel = GUICtrlCreateLabel('', 0, 0, 0, 0)
GUICtrlSetState(-1, $GUI_FOCUS)
$nDummy = GUICtrlCreateDummy()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nDummy
			Send('{RIGHT}')
			Switch GUICtrlRead($nDummy)
				Case 2, 3
					GUICtrlSetState($nLabel, $GUI_FOCUS)
			EndSwitch
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $iIDFrom, $iCode, $tNMHDR, $tInfo, $a_Date[3][2] = [['Day'],['Month'],['Year']]

	Switch $hWnd
		Case $hGUI
			$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
			$iIDFrom = DllStructGetData($tNMHDR, 'IDFrom')
			$iCode = DllStructGetData($tNMHDR, 'Code')
			Switch $iIDFrom
				Case $nDate
					Switch $iCode
						Case $DTN_DROPDOWN
							$aDate[3] = 1
						Case $DTN_CLOSEUP
							$aDate[3] = 0
							GUICtrlSendToDummy($nDummy, 3)
						Case $DTN_DATETIMECHANGE
							If $aDate[3] Then Return 0
							$tInfo = DllStructCreate($tagNMDATETIMECHANGE, $ilParam)
							For $i = 0 To 2
								$a_Date[$i][1] = DllStructGetData($tInfo, $a_Date[$i][0])
								If $aDate[$i] <> $a_Date[$i][1] Then
									$aDate[$i] = $a_Date[$i][1]
									GUICtrlSendToDummy($nDummy, $i)
									ExitLoop
								EndIf
							Next
							Return 0
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
YOgen

YOgen

Знающий
Сообщения
58
Репутация
5
Спасибо всем... пищи для ума надавали :IL_AutoIt_1:
 
Верх