Что нового

Таймер обратного отсчета в GUI с возможностью сброса "в ручную"

SofS

Новичок
Сообщения
4
Репутация
0
Версия AutoIt: v3.3.10.2

Описание:

Открывается окно с 1 активной кнопкой и 1 информативной (рамка). В рамке необходимо сделать таймер обратного отсчета (от 30 мин к 0), по истечению времени которого будет запускаться сценарий кнопки. При этом важна обратная связь, в случае нажатия на кнопку выполняется ее сценарий и таймер обнуляется.

Примечания:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>

GUICreate("InfoTime", 200, 100)


Local $CTRL_btnRefresh = GUICtrlCreateButton("Обновить сейчас", 25, 50, 150, 40)

Local $CTRL_EdtScreen= GUICtrlCreateEdit(" таймер будет", 10, 2, 180, 45, BitOR($ES_READONLY, $ES_CENTER), $WS_EX_STATICEDGE)


GUISetState()

While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
		Case $CTRL_btnRefresh
			Run ("Infotime.exe")
			Sleep (2000)
			WinActivate ("InfoTime", "Обновить сейчас")

Case $GUI_EVENT_CLOSE
                      ExitLoop

    EndSwitch
WEnd

Во вложении срин активного окна (для понимания :smile: )

Важно, окно не должно закрываться и всегда быть на переднем плане ( в идеале потом избавится от лишнего в окне, оставить только кнопку и таймер, без обрамления), что бы всегда по нужде можно было сразу нажать кнопку "обновить". Прошу помочь с созданием таймера обратного отсчета и привязкой его, ибо сам я не смог.

P.S. по нажатию кнопки выполняется еще один скрипт. Можно в принципе его зациклить, а таймер просто для информативности оставить и что бы он по нажатию сбрасывался и автоматом еще. :scratch:
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
SofS

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

Global $timer, $Secs, $Mins, $Hour, $Time
$hGui = GUICreate("InfoTime", 200, 100, -1, -1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_CONTROLPARENT, $WS_EX_TOPMOST))


Local $CTRL_btnRefresh = GUICtrlCreateButton("Обновить сейчас", 25, 50, 150, 40)
GUICtrlSetFont(-1, 12, 600)

Global $CTRL_EdtScreen = GUICtrlCreateEdit("00:00:00", 10, 2, 180, 45, BitOR($ES_READONLY, $ES_CENTER), $WS_EX_STATICEDGE)
GUICtrlSetFont(-1, 25)
GUICtrlSetColor(-1, 0xFF0000)
GUISetState()

$timer = TimerInit()
AdlibRegister("Timer", 50)

While 1
	$iMsg = GUIGetMsg()
	Switch $iMsg
		Case $CTRL_btnRefresh
			$timer = TimerInit()
			;Run("Infotime.exe")
			;Sleep(2000)
			;WinActivate("InfoTime", "Обновить сейчас")

		Case $GUI_EVENT_CLOSE
			ExitLoop

	EndSwitch
WEnd

Func Timer()
	_TicksToTime(1801000 - Int(TimerDiff($timer)), $Hour, $Mins, $Secs)
	Local $sTime = $Time
	$Time = StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs)
	If $sTime <> $Time Then GUICtrlSetData($CTRL_EdtScreen, $Time)
EndFunc   ;==>Timer
 
Автор
SofS

SofS

Новичок
Сообщения
4
Репутация
0
WSWR
Спасибо огромное, да, это в принципе то, что нужно!
А что делает таймер по истечению времени?
Я раскомментировал строчку с запуском скрипта по кнопке, но по окончанию таймера она автоматически не запускается. Я что-то упустил?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
SofS
А что делает таймер по истечению времени?

Действительно, ничего не делает...

Тогда можно так:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>

Global $timer, $Secs, $Mins, $Hour, $Time, $bK = 0
$hGui = GUICreate("InfoTime", 200, 100, -1, -1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_CONTROLPARENT, $WS_EX_TOPMOST))

Local $CTRL_btnRefresh = GUICtrlCreateButton("Обновить сейчас", 25, 50, 150, 40)
GUICtrlSetFont(-1, 10, 600)

Global $CTRL_EdtScreen = GUICtrlCreateEdit("00:00:00", 10, 2, 180, 45, BitOR($ES_READONLY, $ES_CENTER), $WS_EX_STATICEDGE)
GUICtrlSetFont(-1, 20)
GUICtrlSetColor(-1, 0xFF0000)
GUISetState()

$timer = TimerInit()
AdlibRegister("Timer", 200)

While 1
	$iMsg = GUIGetMsg()
	Switch $iMsg
		Case $CTRL_btnRefresh
			_Run()
			$timer = TimerInit()
			$bK = 0
		Case $GUI_EVENT_CLOSE
			ExitLoop
	EndSwitch
WEnd

Func Timer()
	Local $s = 1802000 - Int(TimerDiff($timer))
	_TicksToTime($s, $Hour, $Mins, $Secs)
	Local $sTime = $Time
	$Time = StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs)
	If $sTime > $Time Then GUICtrlSetData($CTRL_EdtScreen, $Time)
	If $s < 0 And $bK <> 1 Then
		$bK = 1
		_Run()
	EndIf
EndFunc   ;==>Timer

Func _Run()	
	Run("Infotime.exe")
	Sleep(2000)
	WinActivate("InfoTime", "Обновить сейчас")
EndFunc   ;==>_Run
 
  • Like
Реакции: Norm
Автор
SofS

SofS

Новичок
Сообщения
4
Репутация
0
WSWR
Извини, если надоел уже этим.
Все пашет как надо, только таймер одноразовый :-[ По истечению срока стартует код, а таймер заново не начинает отсчитывать.
По задумке раз в 30 минут должен повторятся 1 и тот же код, или же по нажатию кнопки. Сейчас все делает, только одноразово.

-----
UPD
-----
С таймером решил проблему, вставив

$timer = TimerInit()
$bK = 0


В конец тела функции таймера
Код:
Func Timer()

    Local $s = 12000 - Int(TimerDiff($timer))
    _TicksToTime($s, $Hour, $Mins, $Secs)
    Local $sTime = $Time
    $Time = StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs)
    If $sTime > $Time Then GUICtrlSetData($CTRL_EdtScreen, $Time)
    If $s < 0 And $bK <> 1 Then
        $bK = 1
        _Run()
  $timer = TimerInit()
            $bK = 0
    EndIf
EndFunc   ;==>Timer


Уж не знаю насколько это правильный подход, но работает! Завтра проверю в реальных условиях и отпишусь что и как :smile:
 
Верх