Тема: AHK v2: установка флажков в CheckBox GUI из ini файла
Добрый день! Пытаюсь постигать AHK V2. Набросал простой скрипт с 3-я чекбоксами, суть эксперимента была в том, чтобы в Gui установить флажок на чекбокс, если пользователь его ранее устанавливал. То есть пользователь запустил скрипт, выбрал что-то, это сохранилось в ini, и при следующем запуске скрипта это значение подтянулось из файла. Вроде тут все понятно. В первой версии вроде бы, это работало по простому IniRead перед созданием окна и флажки сами ставились в чекбоксы, но это не точно.
Проблемы у меня собственно три:
1) Я явно путаю ж0пу с пальцем и видимо неверно понимаю, как работают переменные во второй версии, справка, увы чему-то учит, но чему не понял
2) Есть желание сохранять состояния чекбоксов "на лету", то есть автоматически по нажатию на чекбокс. То в таком случаи, если
к строке
Checkbox3 := myGui.Add("Checkbox", "vCheckbox3", "Выбираю 3")
добавить OnEvent, чтобы получилось
Checkbox3 := myGui.Add("Checkbox", "vCheckbox3", "Выбираю 3").OnEvent("Click", Save)
То получаю ошибку
Error: Target window not found. (Ошибка: Целевое окно не найдено.)
3) Внизу кода в кнопке Lshift, условие всегда выполняется, то есть равно 1.
If (Checkbox3) {
Подскажите пожалуйста в чем проблемы?(
Мои решения, но они мне кажется сильно костыльными
1) очевидно еще раз англ. справка и англ. ютуб
2) Под чекбоксы добавил
Checkbox1.OnEvent("Click", Save)
Checkbox2.OnEvent("Click", Save)
Checkbox3.OnEvent("Click", Save)
3) Сделал чтение переменной из файла прям внутри функции
If (Checkbox3 := IniRead(ini, "Settings", "Checkbox3")) {
Если сильно режет глаза, то можно так конечно.
Checkbox3 := IniRead(ini, "Settings", "Checkbox3")
If (Checkbox3) {
По такой логике если переменные больше не работают напрямую, то их нужно объявлять глобальными? только как лучше?
Весь код:
#Requires AutoHotkey v2.0
if !FileExist(ini := A_ScriptDir "\ZakazbI.ini") ; Если файл рядом со скриптом не существует, то создать и запись данные по умолчанию
{
Iniwrite 0, ini, "Settings", "Checkbox1" ; 0 или false флажок опущен
Iniwrite 0, ini, "Settings", "Checkbox2"
Iniwrite 0, ini, "Settings", "Checkbox3"
}
myGui := Gui(, "MyGui")
myGui.Add("Text",, "Что выбираешь?")
Checkbox1 := myGui.Add("Checkbox", "vCheckbox1", "Выбираю 1") ;Checkbox1 это глобальная переменная в которую помещается весь элемент создания чекбокса; Checkbox1 это переменная чекбокса
Checkbox2 := myGui.Add("Checkbox", "vCheckbox2", "Выбираю 2")
Checkbox3 := myGui.Add("Checkbox", "vCheckbox3", "Выбираю 3")
__Checkbox1 := IniRead(ini, "Settings", "Checkbox1") ; В переменную __Checkbox1 читаем из файла значение чекбокса
if __Checkbox1 ; Если __Checkbox1 > 0 или не равен 0
ControlSetChecked 1, Checkbox1 ; тогда установить флажок
__Checkbox2 := IniRead(ini, "Settings", "Checkbox2")
if __Checkbox2
ControlSetChecked 1, Checkbox2
__Checkbox3 := IniRead(ini, "Settings", "Checkbox3")
if __Checkbox3
ControlSetChecked 1, Checkbox3
myGui.Add("Button", "default", "&Сохранить настройки").OnEvent("Click", Save)
MyGui.OnEvent("Close", Save => ExitApp())
myGui.Show()
Save(*) {
saved := myGui.Submit(0)
IniWrite(saved.Checkbox1, ini, "Settings", "Checkbox1")
IniWrite(saved.Checkbox2, ini, "Settings", "Checkbox2")
IniWrite(saved.Checkbox3, ini, "Settings", "Checkbox3")
}
~$LShift:: ; Поиск по Lshift
{
If (Checkbox3) { ; Если "Поиск по Shift"
SendEvent "{LCtrl down}{vk46}{LCtrl up}" ;Ctrl + F открываю окно поиска пользователю
} else {
Send "{LShift}"
}
}