PDA

Показать полную графическую версию : [решено] Таймер на 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

SyDr
31-05-2009, 10:02
#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

Creat0R
31-05-2009, 11:59
Лучше использовать 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улять ??
Если не обнулять то неработает ... :(

SyDr
31-05-2009, 16:35
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

Creat0R
31-05-2009, 17:06
при сохранеии в INI если в строке ничего нет то записывается 0 »
Обычно это делается на этапе сохранения в ini, проверка полей только растрачивает ресурсы системы, я бы лично отказался от этого.

P.S
Да и вообще подобные поля лучше обрамлять элементом UpDown, и задать лимит (мин.) в 0.

FlatX007
31-05-2009, 17:16
Проверка полей работает только при открытом меню настройки ... во время работы программы этого непроисходит.

P.S
Да и вообще подобные поля лучше обрамлять элементом UpDown, и задать лимит (мин.) в 0. »

О точно как я раньше недогадался !




© OSzone.net 2001-2012