Что нового

Секундомер в тексте кнопки

AutoLove

Новичок
Сообщения
23
Репутация
1
Написал следующуюпрограмму:
нажимаем кнопку, она исчезает, а взамен появляется новая (скрипт тем временем переходит в режим OnEvent), текст в которой представляет собой секундомер, работающий в режиме реального времени. Очень долго ломал голову над тем как засунуть в текст кнопки секундомер. В итоге придумал - пересоздавать кнопку каждую секунду уже с новым текстом.
Меня терзают смутные сомнения по поводу рациональности этого кода. Вот если создать ссылку на переменную, а ссылку засунуть в текст... Как то так... В общем эксперименты ничего не дали.
Вообще оптимизация этого кода, по моему, очень даже актуальный вопрос (для меня, по крайней мере :smile:)
Какие мысли, господа?)
Код:
#include <GUIConstantsEx.au3>
global $time
global $i
guicreate ("Secondcounter", 120, 90)
$button1=guictrlcreatebutton ("Нажать", 10, 10, 100, 30)
guisetstate ()
while $i<=2
$msg=guigetmsg ()
select
case $msg=$button1
opt ("guioneventmode", 1)
$i=3
endselect
wend
guictrlsetstate ($button1, $gui_hide)
$button2=guictrlcreatebutton ("0:00:00", 10, 50, 100, 30)
MySeccounter ($time)
guidelete()
exit
func MySeccounter ($time)
$hour=0
$min=0
$sec=0

while 1 

while $min<=59
 
 while $sec<=59
     sleep (1000)
    $sec+=1
    select 
       case $sec<10 and $min<10
        $time=$hour & ":0" & $min & ":0" & $sec
        guictrldelete ($button2)
        $button2=guictrlcreatebutton ($time, 10, 50, 100, 30)
           
       case $sec>9 and $min<10
        $time=$hour & ":0" & $min & ":" & $sec
        guictrldelete ($button2)
        $button2=guictrlcreatebutton ($time, 10, 50, 100, 30)
    
       case $sec<10 and $min>9
        $time=$hour & ":" & $min & ":0" & $sec
        guictrldelete ($button2)
        $button2=guictrlcreatebutton ($time, 10, 50, 100, 30)
        
       case $sec>9 and $min>9
        $time=$hour & ":" & $min & ":" & $sec
        guictrldelete ($button2)
        $button2=guictrlcreatebutton ($time, 10, 50, 100, 30)
     endselect
 wend


$min+=1
$sec=0   
    select 
       case $min<10
        $time=$hour & ":0" & $min & ":0" & $sec
        guictrldelete ($button2)
        $button2=guictrlcreatebutton ($time, 10, 50, 100, 30)

       case $min>9
        $time=$hour & ":" & $min & ":0" & $sec
        guictrldelete ($button2)
        $button2=guictrlcreatebutton ($time, 10, 50, 100, 30)
    endselect
wend

$hour+=1
$min=0
$time=$hour & ":0" & $min & ":0" & $sec
guictrldelete ($button2)
$button2=guictrlcreatebutton ($time, 10, 50, 100, 30)

wend

endfunc
 

xklx

Новичок
Сообщения
50
Репутация
3
Помоему было легче просто изменять текст в кнопке спомощью GUICtrlSetData
 
Автор
A

AutoLove

Новичок
Сообщения
23
Репутация
1
Возникает другой вопрос - как продолжить дальнейшее выполнение скрипта после запуска секундомера, ведь функция секундомера представляет собой бесконечный цикл, при входе в который скрипт остаётся внутри него. Ума не приложу, что можно сделать

P. S.
madmasles, в том секундомере смысл такой же - обновление текста кнопки через GUICtrlSetData, только вот цикл по другому (и более умно) организован и оформление есть. Пока не разобрался, что за функция "Int ()" (зато у меня время всегда в формате 0:00:00 :smile:).
 

SECTOR

Продвинутый
Сообщения
398
Репутация
58
Вот мой пример :smile:
Код:
#include <GUIConstants.au3>

$iMaxSec = 5 ;Время таймера, в секундах
$iSec = $iMaxSec
$hTimer = -1

$hGUI = GUICreate("Test",400,300)
$hBut1 = GUICtrlCreateButton("Start",165,20,70,30)

$hBut2 = GUICtrlCreateButton($iMaxSec,165,20,70,30)
GUICtrlSetState(-1,$GUI_HIDE)

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $hBut1
			GUICtrlSetState($hBut1,$GUI_HIDE)
			GUICtrlSetState($hBut2,$GUI_SHOW)
			$iSec = 5
			$hTimer = TimerInit()
	EndSwitch
	If $hTimer <> -1 And TimerDiff($hTimer) >= 1000 Then
		$iSec -= 1
		GUICtrlSetData($hBut2,$iSec)
		If $iSec > 0 Then
			$hTimer = TimerInit()
		Else
			$hTimer = -1
			GUICtrlSetState($hBut2,$GUI_HIDE)
			GUICtrlSetState($hBut1,$GUI_SHOW)
			GUICtrlSetData($hBut2,$iMaxSec)
		EndIf
	EndIf

WEnd


Таймер вроде работает (и OnEvent не требуется)
 
Автор
A

AutoLove

Новичок
Сообщения
23
Репутация
1
SECTOR
ты, наверно, не допонял меня)
Режим OnEvent этому скрипту даром не сдался. Это я хочу встроить секундомер в другой, более массивный, скрипт (программу), который будет работать в режиме OnEvent. Затем, чтобы секундомер отсчитывал время от начала работы, а начало начинается :smile: с нажатия кнопки) Вот как мне оставить работать секундомер и продолжить дальнейшее выполнение алгоритма?
 

SECTOR

Продвинутый
Сообщения
398
Репутация
58
AutoLove
Я запутался, в тексте кнопки должно быть время, которое скрипт выполняется после нажатия на кнопку? Если да, то так
Код:
#include <GUIConstants.au3>
#include <Date.au3>

Global $hTimer = -1

$hGUI = GUICreate("Test",400,300)
$hBut1 = GUICtrlCreateButton("Start",10,10,70,30)
$hBut2 = GUICtrlCreateButton("0:0:0",10,10,70,30)
GUICtrlSetState(-1,$GUI_HIDE)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $hBut1
			GUICtrlSetState($hBut1,$GUI_HIDE)
			GUICtrlSetState($hBut2,$GUI_SHOW)
			$hTimer = TimerInit()
			AdlibRegister("SetTime",500)
			ExitLoop ; Если цикл должен закончиться
	EndSwitch
WEnd

; Далее то, что делает скрипт....
Do
	ToolTip("x="&MouseGetPos(0)&@CRLF&"y="&MouseGetPos(1),10,10)
	Sleep(10)
Until GUIGetMsg() = -3
Exit

Func SetTime()
	Local $s,$m,$h
	_TicksToTime(Round(TimerDiff($hTimer),0),$h,$m,$s)
	GUICtrlSetData($hBut2,$h&":"&$m&":"&$s)
EndFunc
 
Автор
A

AutoLove

Новичок
Сообщения
23
Репутация
1
SECTOR
Спасибо, нужно будет разобраться в этом коде, так как ещё не обрёл навыка сразу всё видеть)
Отпишусь как разберусь, но похоже, что это подходит :beer:smile:
 
Автор
A

AutoLove

Новичок
Сообщения
23
Репутация
1
SECTOR
да, это то, что нужно, ещё раз спасибо)

единственно, что не до конца понял как это работает - главное работает так, как нужно)
 

SECTOR

Продвинутый
Сообщения
398
Репутация
58
Ну ты пиши, что не понятно :smile:
Обьясним, расскажем, подробно разжуем :smile:
 
Верх