Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Таймер на Input (http://forum.oszone.net/showthread.php?t=141484)

FlatX007 31-05-2009 05:40 1131415

Таймер на Input
 
Вобщем нужно если из 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 1131473

Код:

#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 1131536

Лучше использовать 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 1131548

Цитата:

Цитата Creat0R
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 1131583

Вот никак непойму зачем переменную $sNewDate каждый раз обNoулять ??
Если не обнулять то неработает ... :(

SyDr 31-05-2009 16:35 1131660

Цитата:

Цитата FlatX007
Цитата:

Цитата Creat0R
P.S
Но в твоём примере, если при ожидании 5-ти секунд юзер вводит данные в поле, то они заменяются на 0 в любом случае. »

Это я перетрудился наверно ... запутался в 2х строчках, я на форум неправильно вставил - эти вроде так было»

Это мне :)
Просто я сначала пишу. Потом думаю. Я не проверяю, ввёл ли кто-то что-нибудь в поле после того, как там появилось ""

Цитата:

Цитата FlatX007
Вот никак непойму зачем переменную $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 1131673

Это для этого ...
Это вообще для понта сделано :) ... ибо при сохранеии в INI если в строке ничего нет то записывается 0

Creat0R 31-05-2009 17:06 1131678

Цитата:

Цитата FlatX007
при сохранеии в INI если в строке ничего нет то записывается 0 »

Обычно это делается на этапе сохранения в ini, проверка полей только растрачивает ресурсы системы, я бы лично отказался от этого.

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

FlatX007 31-05-2009 17:16 1131683

Проверка полей работает только при открытом меню настройки ... во время работы программы этого непроисходит.

Цитата:

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

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


Время: 15:28.

Время: 15:28.
© OSzone.net 2001-