1

Тема: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

На работе, в определённое время нужно запускать батники, и иногда дело происходит ночью, и спросонья можно 2 раза выполнить одно и тоже -что приведёт к двойному выполнению батника. Потому было бы здорово, чтобы чекбокс блокировал нажатие кнопки.
Хотелось, чтобы чекбокс ставил флажок на против кнопки в определённое время -тем самым блокировал кнопку(делал неактивной). На пример в 02:00 ставится флажок, и кнопка делается неактивной, но если вручную снять галочку чекбокса то кнопка становится активной.
Прошу помощи разобраться, здесь что-то совсем не могу понять без примера как такое сделать.


Gui, Add, Button, x82 y10 w100 h30 gUpdate, Button 1
Gui, Add, CheckBox, x52 y10 w20 h20 , 12

Gui, Add, Button, x82 y60 w100 h30 gTimeSynh, Button 2
Gui, Add, CheckBox, x52 y60 w20 h20 , 22

Gui, Show, x134 y81 h175 w223, New GUI Window
Return

Update:
 {
    Run D:\1\update.bat
 }
Return

TimeSynh:
 {
    Run D:\1\timesynh.bat
 }
Return

GuiClose:
ExitApp

2

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

Почитайте соседнюю тему, там есть пример использования команды GUIControl, Disable. В русскоязычной документации эта команда не расписана, но можно почитать на официальном сайте.
А ещё можно сделать перевод документации по этой команде (и увековечить своё имя в проекте перевода).

3 (изменено: serzh82saratov, 2013-03-24 22:04:26)

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

Новичкам без примеров, тяжело.



BlockTimeUpdate = 21:26
BlockTimeTimeSynh = 21:26

Gui, Add, Button, x82 y10 w100 h30 gUpdate vUpdate, Update
Gui, Add, CheckBox, x52 y10 w20 h20 vCheckUpdate gCheckUpdate
Gui, Add, Button, x82 y60 w100 h30 gTimeSynh vTimeSynh, TimeSynh
Gui, Add, CheckBox, x52 y60 w20 h20 vCheckTimeSynh gCheckTimeSynh
Gui, Show, x134 y81 h175 w223, New GUI Window  
SetTimer, Block, 50000 
Return
    
Block:
    If BlockTimeUpdate = %A_Hour%:%A_Min%
    {
        GuiControl,, CheckUpdate, 1
        Gosub, CheckUpdate
    }    
    If BlockTimeTimeSynh = %A_Hour%:%A_Min%
    {
        GuiControl,, CheckTimeSynh, 1 
        Gosub, CheckTimeSynh
    }
    Return

CheckUpdate:
    GuiControlGet, CheckUpdate 
    GuiControl, % CheckUpdate ? "Disable" : "Enable", Update
    Return
    
CheckTimeSynh:
    GuiControlGet, CheckTimeSynh
    GuiControl, % CheckTimeSynh ? "Disable" : "Enable", TimeSynh
    Return
    
Update: 
    MsgBox  D:\1\update.bat 
    Return

TimeSynh: 
    MsgBox  D:\1\timesynh.bat 
    Return   

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

Вот спасибо. Адаптировал под свой код, всё отлично. Только странно, в ручную если ставить галочку, то не дисэйблится боттон и немного таймер тормозит, сек на 30, но а в общем всё как нужно, вы даже учли то, что я не написал, сделали отдельные тайминги, вспомнил про это, уже когда ушел из дома
2ypppu Английский я не очень хорошо знаю, тем более если читать подобное, да и пишу свои недо-когда по примерам и только, не так много знаний чтобы правильно понимать из описания даже русского.

5

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

Только странно, в ручную если ставить галочку, то не дисэйблится боттон и немного таймер тормозит,

Поподробнее.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6 (изменено: unKn0wn, 2013-03-25 03:31:58)

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

Сглупил по невнимательности. С чекбоксами всё хорошо, могу в ручную галочками делать неактивными, напутал во время адаптации под себя
А вот с таймингамм -здесь даже не знаю, пробовал в вашем варианте и своём, всегда от 15-30 секунд разница, время я сверю с системным. На пример ставлю 01:28 и смотрю по сис времени, и уже только в 01:28:30 реагирует. Но это совсем не важно, это время не сыграет не какой роли.
Вот ещё одно, если программу запустить после "будильника" то есть позже чем те-же 01:28 -на пример в 01:30 то не будет проверки на время при запуске и флажок не буде стоять?

7 (изменено: serzh82saratov, 2013-03-25 03:37:03)

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

На пример ставлю 01:28 и смотрю по сис времени, и уже только в 01:28:30 реагирует.


SetTimer, Block, 50000

Прверка каждые 50 секунд. Поставьте 1000 чтоб каждыю секунду проверялось.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: serzh82saratov, 2013-03-25 03:44:20)

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

Вот ещё одно, если программу запустить после "будильника" то есть позже чем те-же 01:28 -на пример в 01:30 то не будет проверки на время при запуске и флажок не буде стоять?

Тут вы уже должны полностью описать алгоритм. Задача была:

На пример в 02:00 ставится флажок

А если повашему "если программу запустить после "будильника" то флажок надо ставить всегда при страте. Ведь непонятно насколько больше текущее время должно быть больше от заданного для блокировки.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

Вы правы. Наверное лучшим решением будет ставить галочки при запуске, а блокировку по времени использовать как страховку после использовании кнопки.

10 (изменено: serzh82saratov, 2013-04-07 20:31:50)

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

Озадачился вопросом. Получилось:



BTHour := 20 , BTMin := 1 , MaxInterval := 5 , CurTime := A_Hour A_Min , BlockTime := BTHour BTMin , DMin := 60000
 
Gui, Add, CheckBox, vCheckUpdate Section gCheckUpdate
Gui, Add, Button, x+1 yp vUpdate, Update
Gui, Add, CheckBox, xs y+10 vCheckTimeSynh gCheckTimeSynh
Gui, Add, Button, x+1 yp vTimeSynh, TimeSynh
Gui, Show, , Update & TimeSynh

If (CurTime >= BlockTime && CurTime <= BlockTime + MaxInterval) 
    Gosub, TimeBlockButton  
Else If (CurTime > BlockTime)  
    SetTimer, TimeBlockButton, %  ((23 - (A_Hour - BTHour)) * (DMin * 60)) + (60 - (Abs(BTMin - A_Min)) * DMin) - (A_Sec *1000)  
Else 
    SetTimer, TimeBlockButton, %  ((BTHour - A_Hour - 1) * (DMin * 60)) + ((60 - (A_Min-BTMin)) * DMin) - (A_Sec *1000)  
Return

TimeBlockButton:     
    SetTimer, TimeBlockButton, 86400000      ; Сутки 
    GuiControl, , CheckUpdate, 1 
    GuiControl, , CheckTimeSynh, 1 
    GuiControl, Disable, Update 
    GuiControl, Disable, TimeSynh 
    Return
    
CheckUpdate:
    GuiControlGet, CheckUpdate  
    GuiControl, % CheckUpdate ? "Disable" : "Enable", Update 
    Return 
    
CheckTimeSynh:
    GuiControlGet, CheckTimeSynh
    GuiControl, % CheckTimeSynh ? "Disable" : "Enable", TimeSynh
    Return

BTHour - Час отключения
BTMin - Минута отключения
MaxInterval - Кол-во минут на которое время может быть больше, и всё равно блокировать

Проблемы:
Как учесть переходы с 59 на 00 в минутах при сравнении, и незабыть про MaxInterval
Как запускать таймер повторно, чтоб он срабатывал через сутки ровно в назначенное время.
Как вообще это проще сделать?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

В принципе можно сделать ещё одно время UNBlock, которое будет снимать блокировку. В моём случае программа имеет актуальность с 23 часов до 5 утра блок нужен на время до 9 утра, как раз заканчивается моя смена

12 (изменено: serzh82saratov, 2013-04-16 22:55:53)

Re: AHK: GUI. Блокировка botton посредством флажка из checkbox'a

Осенило быдлокодера
Вроде как учтены переходы между сутками, годами. + точный повторный таймер на следующие сутки, учитывая если блокировка произошла при старте (в период MaxInterval).



#SingleInstance force  
BlockTime = 15:47
MaxInterval = 5
 
Gui, Add, CheckBox, vCheckTimeSynh gCheckBox, % ""
Gui, Add, Button, x+1 yp vTimeSynh w110, TimeSynh
Gui, Add, CheckBox, xm vCheckUpdate gCheckBox, % ""
Gui, Add, Button, x+1 yp w110 vUpdate, Update 
Gui, Show, , Update & TimeSynh

UpdTimerInterval:
    Timer := DifferenceTime(BlockTime)
    If (Timer < 86400000 - (MaxInterval * 60000))
        SetTimer, TimeBlockButton, % Timer
    Else
        Gosub, TimeBlockButton 
    Return 

TimeBlockButton:   
    GuiControl, , CheckUpdate, 1 
    GuiControl, , CheckTimeSynh, 1 
    GuiControl, Disable, Update 
    GuiControl, Disable, TimeSynh 
UpdTimer:
    SetTimer, TimeBlockButton, % DifferenceTime(BlockTime)
    Return
    
DifferenceTime(Time)  {   
    Time := Time2 := A_YYYY A_MM A_DD RegExReplace(Time, ":") 00  
    EnvSub, Time, A_Now, Second 
    Time := (Time * 1000) - A_MSec
    If Time >= 0
        Return Time
    Time2 += 1, days
    EnvSub, Time2, A_Now, Second
    Return (Time2 * 1000) - A_MSec
}
    
CheckBox:
    GuiControlGet, %A_GuiControl%   
    GuiControl, % %A_GuiControl% ? "Disable" : "Enable", % SubStr(A_GuiControl, 6)
    Return 

MaxInterval - Кол-во минут, на которое текущее время может быть больше чем BlockTime, и всё равно блокировать при старте скрипта. BlockTime задаётся в четырёх значном формате, можно без двоеточия.
Функция DifferenceTime возвращает разницу текущего и указанного времени в миллисекундах. То есть если указано 01:00, а текущее время 02:00, то вернётся 23 часа в миллисекундах.
Использование команды "Pause" в данном случае не есть - ГУД. Хотя после паузы можно запускать метку "UpdTimerInterval" для обновления таймера с учётом MaxInterval, или "UpdTimer" без его учёта.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui