Показать полную графическую версию : [решено] Таймер на Input
FlatX007
31-05-2009, 05:40
Вобщем нужно если из Input удалили все символы, то через 5 секунд там появилась цифра 0
Если вписали данные то 0 удаляется .
Я начал писать но почемуто неработает ... пол ночи просидел всю голову сломал.
Один из вариантов:
#include <Date.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $sNewDate
$Form1 = GUICreate("Form1", 265, 42, -1, -1)
$Input1 = GUICtrlCreateInput("Input1", 8, 8, 241, 21)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $nMsg = 1
If GUICtrlRead($Input1) = "" Then $sNewDate = Round (StringRight(_DateAdd('s',5, _NowCalc()), 2) )
If Round(@SEC) = $sNewDate Then GUICtrlSetData($Input1, "0")
EndSwitch
WEnd
#include <Date.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $sNewDate = "No"
$Form1 = GUICreate("Form1", 265, 42, -1, -1)
$Input1 = GUICtrlCreateInput("Input1", 8, 8, 241, 21)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If GUICtrlRead($Input1) = "" And $sNewDate = "No" Then $sNewDate = Mod(@SEC + 5, 60)
If @SEC = $sNewDate Then
GUICtrlSetData($Input1, "0")
$sNewDate = "No"
EndIf
WEnd
Лучше использовать WM_COMMAND в этом случае:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
;
Global $iTimer = -1
$Form1 = GUICreate("Form1", 265, 42, -1, -1)
$Input1 = GUICtrlCreateInput("Input1", 8, 8, 241, 21)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If $iTimer <> -1 And TimerDiff($iTimer) >= 5000 Then
GUICtrlSetData($Input1, "0")
$iTimer = -1
EndIf
WEnd
Func WM_COMMAND($hWnd, $msg, $wParam, $lParam)
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0xFFFF)
Local $hCtrl = $lParam
Switch $nID
Case $Input1
Switch $nNotifyCode
Case $EN_CHANGE, $EN_UPDATE ; Edit (Input) control has been changed
Local $sInput_Data = GUICtrlRead($Input1)
If $sInput_Data = "" Then
$iTimer = TimerInit()
Else
$iTimer = -1
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Sylver Dragon,
Неплохо придумано с секундами, я не думал что так таймер можно построить :)
$hTimer = _TimerSec_Init(3)
_TimerSec_Wait($hTimer)
Func _TimerSec_Init($iSec)
Return Mod(@SEC + $iSec, 60)
EndFunc
Func _TimerSec_Wait($hTimer)
Do
Sleep(10)
Until @SEC = $hTimer
EndFunc
P.S
Но в твоём примере, если при ожидании 5-ти секунд юзер вводит данные в поле, то они заменяются на 0 в любом случае.
FlatX007
31-05-2009, 12:29
P.S
Но в твоём примере, если при ожидании 5-ти секунд юзер вводит данные в поле, то они заменяются на 0 в любом случае. »
Это я перетрудился наверно :) ... запутался в 2х строчках, я на форум неправильно вставил - эти вроде так было
Case $nMsg = 1
If GUICtrlRead($Input1) = "" Then
$sNewDate = Round (StringRight(_DateAdd('s',5, _NowCalc()), 2) )
If Round(@SEC) = $sNewDate Then GUICtrlSetData($Input1, "0")
EndIf
FlatX007
31-05-2009, 13:38
Вот никак непойму зачем переменную $sNewDate каждый раз обNoулять ??
Если не обнулять то неработает ... :(
P.S
Но в твоём примере, если при ожидании 5-ти секунд юзер вводит данные в поле, то они заменяются на 0 в любом случае. »
Это я перетрудился наверно ... запутался в 2х строчках, я на форум неправильно вставил - эти вроде так было»
Это мне :)
Просто я сначала пишу. Потом думаю. Я не проверяю, ввёл ли кто-то что-нибудь в поле после того, как там появилось ""
Вот никак непойму зачем переменную $sNewDate каждый раз обNoулять ??
Если не обнулять то неработает ...
Дело в том, что там только секунды. Если не сбрасывать значение - строчка будет каждую минуту сбрасываться на 0. Там может быть любое значение кроме целых чисел от 0 до 59 включительно.
Правда если в эту секунду скрипт на паузе (MsgBox, InputBox и т.д.) - нифига не сбросится. Потому что не проверится.
Кста, если не секрет, для чего это используется?
Вот чуток исправленный вариант.
If $sNewDate = -1 And GUICtrlRead($Input1) = "" Then $sNewDate = Mod(@SEC + 5, 60)
If @SEC = $sNewDate Then
If GUICtrlRead($Input1) Then GUICtrlSetData($Input1, "0")
$sNewDate = -1
EndIf
FlatX007
31-05-2009, 16:59
Это для этого ...
Это вообще для понта сделано :) ... ибо при сохранеии в INI если в строке ничего нет то записывается 0
при сохранеии в INI если в строке ничего нет то записывается 0 »
Обычно это делается на этапе сохранения в ini, проверка полей только растрачивает ресурсы системы, я бы лично отказался от этого.
P.S
Да и вообще подобные поля лучше обрамлять элементом UpDown, и задать лимит (мин.) в 0.
FlatX007
31-05-2009, 17:16
Проверка полей работает только при открытом меню настройки ... во время работы программы этого непроисходит.
P.S
Да и вообще подобные поля лучше обрамлять элементом UpDown, и задать лимит (мин.) в 0. »
О точно как я раньше недогадался !
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.