Что нового

Специальный секундомер

Alexander

Новичок
Сообщения
105
Репутация
2
Версия AutoIt: 3.

Описание: Нужно сделать секундомер, но не обычный. Таймер должен запускаться и останавливаться пробелом. При открытии программы внизу секундомера должен быть текст. Когда жмешь пробел и начинает считаться время, то этот текст изменяется (но не изменяется когда останавливаешь секундомер). И так 5 раз и для каждого раза свой текст (для каждой попытки я буду вводить текст в коде программы).
Каждая попытка должна записываться в колонку справа. И после каждой попытки чтоб можно было нажать кнопку "+2" (к попытке добавляется 2с) и "не засчитано" (на место попытки ставится не время, а NA). После того, как все 5 раз сделано, таймер убирается (и все что было) и выводится общий результат и 3 поля для ввода ФИО. Как подсчитать общий результат: лучшая и худшая (если есть NA - это и будет худшая) попытки убираются, а из оставшихся 3-х подсчитывается среднее арифметическое. Это и будет общим результатом.
После чего мне на мыло шлется общий результат, результат каждой попытки (их 5) и ФИО.

Примечания: Если 2 попытки NA, то и общим результатом будет NA
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
А что тут самое сложное?
А если так?
Секундомер должен запускаться и останавливаться пробелом. При открытии программы внизу секундомера должен быть текст. Когда жмешь пробел и начинает считаться время, то этот текст изменяется (но не изменяется когда останавливаешь секундомер). И так 5 раз и для каждого раза свой текст (для каждой попытки я буду вводить текст в коде программы).
Каждая попытка должна записываться в колонку справа. И после каждой попытки чтоб можно было нажать кнопку "+2" (к попытке добавляется 2с) и "не засчитано" (на место попытки ставится не время, а NA). После 5 раз таймер выключается, выводится окно ,что нужно ввести ФИО и записывается в текстовый файл результат каждой попытки и ФИО
Т.е. убрал подсчет общего результата и отправки на имейл ;D
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
Все решилось! Оказалось, что мне этого всего не нужно ;D
И чтоб не создавать новую тему, пишу тут.
Нужен просто секундомер в элементе Edit. Чтоб результат можно было скопировать, но не изменить! Т.е. $ES_Readonly. Чтоб запускался и останавливался пробелом. Чтоб я его смог вставить в любое место окна программы. И все! Почему я сам не могу сделать? Я не знаю как делаются секундомеры вообще. Напишите, пожалуйста, я разберусь! (Желательно с комментами)
 

VladUs

Скриптер
Сообщения
621
Репутация
180
Вот пример таймера из офф. справки

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


Opt("TrayIconDebug", 1)
Opt("MustDeclareVars", 1)

Global $timer, $Secs, $Mins, $Hour, $Time

_Main()

Func _Main()
	;Create GUI
	GUICreate("Timer", 120, 50)
	GUICtrlCreateLabel("00:00:00", 10, 10)
	GUISetState()
	;Start timer
	$timer = TimerInit()
	AdlibRegister("Timer", 50)
	;
	While 1
		;FileWriteLine("debug.log",@min & ":" & @sec & " ==> before")
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				Exit
		EndSwitch
		;FileWriteLine("debug.log",@min & ":" & @sec & " ==> after")
	WEnd
EndFunc   ;==>_Main
;
Func Timer()
	_TicksToTime(Int(TimerDiff($timer)), $Hour, $Mins, $Secs)
	Local $sTime = $Time  ; save current time to be able to test and avoid flicker..
	$Time = StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs)
	If $sTime <> $Time Then ControlSetText("Timer", "", "Static1", $Time)
EndFunc   ;==>Timer
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
AZJIO [?]
К сожалению скрипт Kaster найти не могу,
Ты про этот?
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>

Opt('GUIOnEventMode', 1)
Global $sIND = 'Stop'
Global $Pause
Global $sTitle = 'Main Title'
$hParent = GUICreate('Timer', 160, 40, -1, -1, $WS_POPUP, BitOR($GUI_WS_EX_PARENTDRAG, $WS_EX_TOPMOST))
GUISetState()

$hLabel = GUICtrlCreateLabel('', 2, 2, 156, 36)
GUICtrlSetFont(-1, 20, 1000)
GUICtrlSetColor(-1, 0xc03d3a)
GUICtrlSetBkColor(-1, 0xffffff)
WinSetTrans('Timer', '', 100)

GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_Move')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_Move')
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, '_Move')
HotKeySet('{Enter}', '_TogglePause')

While 1
    $sLabel = @HOUR & ':' & @MIN & ':' & @SEC & '.' & @MSEC
    GUICtrlSetData($hLabel, $sLabel)
    Sleep(90)
WEnd
Func _Exit()
    Exit
EndFunc

Func _Move()
    Switch @GUI_CtrlID
        Case $GUI_EVENT_PRIMARYDOWN
            Global $aWCoord_B = WinGetPos('Timer')
            Global $aMCoord_B = MouseGetPos()
            Global $ixWCoord_B = $aWCoord_B[0]
            Global $iyWCoord_B = $aWCoord_B[1]
            Global $ixMCoord_B = $aMCoord_B[0]
            Global $iyMCoord_B = $aMCoord_B[1]
            Global $ixDelta = $ixMCoord_B - $ixWCoord_B
            Global $iyDelta = $iyMCoord_B - $iyWCoord_B
            If ($ixDelta <= 170 AND $iyDelta <= 40) Then $sIND = 'Move'
        Case $GUI_EVENT_MOUSEMOVE
            If $sIND = 'Move' Then
                $aMCoord = MouseGetPos()
                $ixMCoord = $aMCoord[0]
                $iyMCoord = $aMCoord[1]
                $ixWCoord = $ixMCoord - $ixDelta
                $iyWCoord = $iyMCoord - $iyDelta
                WinMove('Timer', '', $ixWCoord, $iyWCoord)
            EndIf
        Case $GUI_EVENT_PRIMARYUP
            $sIND = 'Stop'
    EndSwitch
EndFunc

Func _TogglePause()
    If WinActive($sTitle) Then
        $Pause = NOT $Pause
        While $Pause
            Sleep(100)
        WEnd
    EndIf
EndFunc

я его писал в "младенчестве", поэтому ни за оптимизацию, ни за работоспособность (уже) не ручаюсь.
PS: я к сожалению, в отличие от тебя, не веду коллекцию своих скриптов, поэтому приходится выуживать свои же скрипты из форумов :(
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
1. Мне нужно, чтоб в формате МИН:СЕК:(ДЕСЯТЫЕ И СОТЫЕ).
2. В Элементе GUICtrlCreateEdit. Чтоб результат можно было скопировать, но не изменить! Т.е. $ES_Readonly.
3. Запускалось пробелом или другой спец. кнопкой.
Кто может - сделайте, пожалуйста :smile:
PS. Чтоб я мог вставить в любое место окна программы :smile:
 

VladUs

Скриптер
Сообщения
621
Репутация
180
Если нужен просто отсчет времени, то вот
на основе с офф. форума
Код:
#include <Date.au3> ; used for _TicksToTime()
#Include <GuiEdit.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
HotKeySet("{ESC}", "Quit") ; to exit
HotKeySet("{F1}", "start_timer") ; Start or Reset timer
;Set and unset Pause and Resume hotkeys, eliminates multi pressing of pause or resume.

$Gui = GUICreate("Timer",200,50,Default,Default,$GUI_SS_DEFAULT_GUI, $WS_EX_TOPMOST)
$GuiEdit = GUICtrlCreateEdit("",0,0,200,50,$ES_READONLY)
GUICtrlSetFont ($GuiEdit,8, 800, 2, "Areal")
GUICtrlSetBkColor ( $GuiEdit, 0xFAEBD7 )

GUISetState()
Global $Init0, $PausedTimer, $iHours, $iMins, $iSecs

While GUIGetMsg() <> $GUI_EVENT_CLOSE	
    Sleep(10) ; Small sleep to lower cpu usage
WEnd

; The function that starts or resets the stopwatch
Func start_timer()
    HotKeySet("{F2}") ;disable resume timer
    HotKeySet("{F4}", "pause_timer") ;enable pause timer
    $PausedTimer = 0
    $Init0 = TimerInit()
    AdlibRegister("show_timer", 60)
EndFunc   ;==>start_timer

; The function that pauses the stopwatch
Func pause_timer()
    HotKeySet("{F4}") ;disable pause timer
    HotKeySet("{F2}", "resume_timer") ;enable resume timer
    $PausedTimer += Int(TimerDiff($Init0))
    AdlibUnRegister()
EndFunc   ;==>pause_timer

; The function that resumes the stopwatch
Func resume_timer()
    HotKeySet("{F2}") ;disable resume timer
    HotKeySet("{F4}", "pause_timer") ;enable pause timer
    $Init0 = TimerInit()
    AdlibRegister("show_timer", 60)
EndFunc   ;==>resume_timer

Func show_timer()
    ; _TicksToTime to get hours, mins, seconds
    _TicksToTime(Int(TimerDiff($Init0) + $PausedTimer), $iHours, $iMins, $iSecs)
    $TimeShift = TimerDiff($Init0)/1000 + $PausedTimer
    ;StringFormat to display the time as HH:MM:SS
	GUICtrlSetData ( $GuiEdit,"HH:MM:SS:MS = " & StringFormat("%02i:%02i:%02i ", $iHours, $iMins, $iSecs) &" " &  StringRight(TimerDiff($Init0)+ $PausedTimer,2) )

EndFunc   ;==>show_timer
; Exit
Func Quit()
    Exit
EndFunc   ;==>Quit
Кнопка F1 - Запускает секундомер и обнуляет его (если нажать еще раз)
Кнопка F4 - Пауза
Кнопка F2 - Продолжает отсчет
Кнока ESC - Выход
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Alexander, вот тебе специальная UDF библиотека для твоего специального секундомера + простецкий пример. Надеюсь, назначить горячую клавишу ты сам сможешь.

Код:
#Include <GUIConstantsEx.au3>
#Include <Stopwatch.au3>

GUICreate('MyGUI', 400, 400)
_GUICtrlStopwatch_Create('', 20, 20, 49, 19)
$Button = GUICtrlCreateButton('Start', 165, 366, 70, 23)
GUICtrlSetState(-1, $GUI_DEFBUTTON)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button
			If _GUICtrlStopwatch_IsCount() Then
				_GUICtrlStopwatch_Stop()
				GUICtrlSetData($Button, 'Start')
			Else
				_GUICtrlStopwatch_Start()
				GUICtrlSetData($Button, 'Stop')
			EndIf
	EndSwitch
WEnd
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
VladUs
Yashied
Спасибо! Понравились оба, но последний жутко тормозит рывками. Даже не знаю почему :-\
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Это мой? Как тормозит? Там и тормозить-то нечему... Ты запускал мой скрипт или пытался приспособить его под свои задачи?
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
Yashied
Да, твой. Как ты мне дал, так и запустил, ничего не трогал... Оно рывками идет... "1.32 - тормоз - 3.46"...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
:wacko:

Я даже не знаю, что и сказать... Только что попробывал во всех системах (XP, Vista, 7) на всех мыслимых компьютерах, включая жутко медленный ноутбук, и все везде отлично работает.

Ты точно запускал именно тот пример, который я дал? Какая система? И еще, пример из справки для функции _Timer_SetTimer() у тебя нормально работает?
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
Yashied сказал(а):
Ты точно запускал именно тот пример, который я дал? Какая система? И еще, пример из справки для функции _Timer_SetTimer() у тебя нормально работает?
Точно.
XP Professional SP3.
Да нормально работает ;)
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
Как сделать, чтоб в этом таймере только при отпускании пробела запускалось время?

Код:
#Include <GuiEdit.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>

Func _TicksToTime($iTicks, ByRef $iSecs)
	If Number($iTicks) > 0 Then
		$iTicks = Int($iTicks / 1000)
		$iTicks = Mod($iTicks, 3600)
		$iSecs = Mod($iTicks, 300)
	Return 1
	ElseIf Number($iTicks) = 0 Then
		$iTicks = 0
		$iMins = 0
		$iSecs = 0
		Return 1
	Else
		Return SetError(1,0,0)
	EndIf
EndFunc   

$fishka = '0'
HotKeySet("{SPACE}", "start_timer") 
 
$Gui = GUICreate("Timer",200,50,Default,Default,$GUI_SS_DEFAULT_GUI, $WS_EX_TOPMOST)
$GuiEdit = GUICtrlCreateEdit("00.00",0,0,200,50,$ES_READONLY)
GUICtrlSetFont ($GuiEdit,20, 800)
;GUICtrlSetBkColor ( $GuiEdit, 0xFAEBD7 )

GUISetState()
Global $Init0, $PausedTimer, $iSecs

While GUIGetMsg() <> $GUI_EVENT_CLOSE  
    Sleep(10) 
WEnd

Func start_timer()
	If $fishka = '0' Then 
	$Init0 = TimerInit()
    AdlibRegister("show_timer", 60)
	$fishka = '1'
	If $fishka = '1' Then HotKeySet("{SPACE}", "pause_timer") 
	ENdIf
	EndFunc  

Func pause_timer()
	If $fishka = '1' Then
	AdlibUnRegister()
	$fishka = '0'
	If $fishka = '0' Then HotKeySet("{SPACE}", "start_timer") 
	Endif
EndFunc   

Func show_timer()
	_TicksToTime(Int(TimerDiff($Init0) + $PausedTimer), $iSecs)
    $TimeShift = TimerDiff($Init0)/1000 + $PausedTimer
	GUICtrlSetData ( $GuiEdit, StringFormat("%02i", $iSecs) & "." &  StringRight(TimerDiff($Init0)+ $PausedTimer,2) )
EndFunc
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
Если не в Autoit, то может в WinAPI есть такая функция?
Это оно?
WM_KEYDOWN (WM_KEYUP)
Как использовать ее к этому таймеру? :smile:
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
VladUs
Если знаете помогите, пожалуйста, это встроить в таймер :smile:
--------------------------
Кстати, вот что-то нашел:

Код:
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)


$HWnd = GUICreate("KEYDOWN_TEST",400,300)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')


GUISetState()

GUIRegisterMsg(0x0101, "Get_KeyDown")


Func Get_KeyDown($HWnd,$Command,$wParam,$lParam)
    $s1 = BitAND($wParam,0xFF)
	If $s1 = '32' Then MsgBox(0, '', 'Отпущена кнопка SPACE')
EndFunc

While 1 
    Sleep(100) 
WEnd 
Func _Pro_Exit() 
	Exit 
EndFunc


Помогите присобачить это к программе. А то у меня чего-то не получается. Как будто это не действует в этом таймере. Странно...
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Alexander [?]
Как сделать, чтоб в этом таймере только при отпускании пробела запускалось время?
Добавьте UDF:
Код:
#include <Misc.au3>


Замените функции start_timer() и pause_timer():
Код:
Func start_timer()
    If $fishka = '0' Then
	While _IsPressed("20")
		Sleep(10)
		If $fishka = '0' Then $fishka = '1'
	WEnd
    $Init0 = TimerInit()
    AdlibRegister("show_timer", 60)
    If $fishka = '1' Then HotKeySet("{SPACE}", "pause_timer")
    EndIf
EndFunc  

Func pause_timer()
    If $fishka = '1' Then
	While _IsPressed("20")
		Sleep(10)
		If $fishka  = '1' Then  $fishka = '0'
	WEnd
    AdlibUnRegister()
    If $fishka = '0' Then HotKeySet("{SPACE}", "start_timer")
    Endif
EndFunc


Теперь, первое отпускание пробела будет запускать таймер, второе останавливать.
 
Верх