1

Тема: 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}"
    }
    }

2

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Vitalkerrain
Вы столько понаписали, мне лень всё читать. У нас одна тема — один вопрос. Что заметил:

Checkbox3 := myGui.Add("Checkbox", "vCheckbox3", "Выбираю 3")

Если вы сохраняете контрол в переменную, то использовать vCheckbox3 уже нет никакого смысла.
Если писать так:

Checkbox3 := myGui.Add("Checkbox", "vCheckbox3", "Выбираю 3").OnEvent("Click", Save)

то в переменной Checkbox3 ничего не окажется, так как метод OnEvent ничего не возвращает. Но можно так:

(Checkbox3 := myGui.Add("Checkbox", "", "Выбираю 3")).OnEvent("Click", Save)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Офтоп.
Вроде простецкая задача для v1, но на v2 практически не реально что-то собрать самому. И это они называют основной версией. Зачем вообще переходить на эту версию? По сути изучать новый язык.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Почему нереально, мне пары дней хватило, чтобы в основных моментах разобраться. Теперь v1 кажется дремучим и неудобным.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

teadrinker пишет:

Если вы сохраняете контрол в переменную, то использовать vCheckbox3 уже нет никакого смысла.

Я правильно понимаю вас, что параметр можно полностью опустить до такого вида?

(Checkbox3 := myGui.Add("Checkbox",, "Выбираю 3")).OnEvent("Click", Save)

Тогда Submit уже не может получить данные, но в файл по-прежнему можно записать:

IniWrite(Checkbox3.Value, ini, "Settings", "Checkbox3")

И в другом функции проверять уже не If (Checkbox3), а If (Checkbox3.Value)?
P.s Submit полностью закомментировал, так как в нем больше нет смысла

6

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Vitalkerrain пишет:

Я правильно понимаю вас, что параметр можно полностью опустить до такого вида?

Да, я это имел в виду.

Vitalkerrain пишет:

Тогда Submit уже не может получить данные

Ну, Submit это немного устаревший способ получить информацию из Gui, лучше использовать Checkbox3.Value, или для некоторых контролов CtrlObj.Text.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: Malcev, 2024-06-14 20:07:37)

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

__Михаил__ пишет:

Офтоп.
Вроде простецкая задача для v1, но на v2 практически не реально что-то собрать самому. И это они называют основной версией. Зачем вообще переходить на эту версию? По сути изучать новый язык.

Так не переходите.
Никаких комплексных нововведений для автоматизации там нету, в основном "шило на мыло":
https://www.autohotkey.com/docs/v2/v2-c … -functions
Другое дело, что всё больше народу переходит на ahk v2, соответственно растет количество библиотек и в будущем на оф.форуме вопросы по ahk v1 будут либо игнорировать, либо рекомендовать переходить на ahk v2.

8

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Malcev пишет:

в основном "шило на мыло"

Не согласен, новая версия устроена более логично, соответственно, программировать проще и быстрее. И главное, приятнее.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Это дело вкуса и привычки.
Я имею в виду новведения, касаемые встроенных инструментов автоматизации.

10

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

А что ты под этим понимаешь?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Встроенная поддержка различных апи: json, ocr, ui automation.

12

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

А в первой версии что из этого есть?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Ничего нету, поэтому я и написал, что:

Malcev пишет:

Никаких комплексных нововведений для автоматизации там нету, в основном "шило на мыло"

14

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Не совсем понял логику тогда. Разве отсутствие чего-то одного, чего и не было раньше, говорит о том, что никаких улучшений нет вообще?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

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

16

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Malcev пишет:

остальные "улучшения" - это дело привычки

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

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Автохотки сейчас пытается копировать ооп языки и ужесточает синтаксис, тем самым теряет свою самобытность и изначальную задачу - язык программирования для людей, которые не программисты и возможно не собираются ими становиться.

18

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Так никто же не заставляет обязательно использовать ООП. Элементы ООП и в первой версии есть. А в чём ты видишь ужесточение синтаксиса? Я вижу, наоборот, упрощение. Другое дело, что синтаксис изменён, и его нужно выучить.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

В первой версии можно писать код не разбираясь, что такое функции, циклы, объекты и прочее.
Во второй версии обыкновенное gui дизайна 2000 года уже требует понимания ооп.

А в чём ты видишь ужесточение синтаксиса?

Всего уже не упомню - я не более 10 кодов написал на автохотки 2.
Но, например:

if (a = 0)
   msgbox
msgbox WinGetClass("WinTitle")

20

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Malcev пишет:

Но, например

Не совсем понял, что ты имеешь в виду. Если варнинг о том, что переменной не было присвоено значение, то это только плюс. Недавно несколько часов искал баг в коде на v1 из-за того, что переменную случайно по-другому назвал. На v2 сразу бы выдало предупреждение.

Malcev пишет:

Во второй версии обыкновенное gui дизайна 2000 года уже требует понимания ооп

Нет, на начальном этапе можно просто пользоваться без понимания, выучив синтаксис через точку.

Malcev пишет:

В первой версии можно писать код не разбираясь, что такое функции, циклы, объекты и прочее

Циклы вроде не изменились. Объекты, как я сказал выше, тоже полностью понимать не обязательно. Вот функции придётся изучить, и связанное понятие "область видимости". Но это не такая уж сложная концепция, можно за день разобраться.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

teadrinker пишет:

Если варнинг о том, что переменной не было присвоено значение, то это только плюс

Там есть еще ворнинг о несуществующем окне.

teadrinker пишет:

Нет, на начальном этапе можно просто пользоваться без понимания, выучив синтаксис через точку.

Где такое написано?
Посмотри справку - это справка для программистов пришедших с других языков:
https://www.autohotkey.com/docs/v2/lib/Gui.htm
Сравни:

Gui Object

class Gui extends Object

Provides an interface to create a window, add controls, modify the window, and retrieve information about the window. Such windows can be used as data entry forms or custom user interfaces.

Gui objects can be created with Gui() and retrieved with GuiFromHwnd.

"MyGui" is used below as a placeholder for any Gui object (and a variable name in examples), as "Gui" is the class itself.

In addition to the methods and property inherited from Object, Gui objects have the following predefined methods and properties.

и

Gui

Creates and manages windows and controls. Such windows can be used as data entry forms or custom user interfaces.

Gui, SubCommand , Value1, Value2, Value3

The SubCommand, Value1, Value2 and Value3 parameters are dependent upon each other and their usage is described below.

Все эти объекты, массивы, словари, функции тяжелы для понимания непрограммиста и нефизмата, мои данные основаны на опыте - сейчас помогаю разбираться подружке в джава.
И если на джаве можно написать код, практически ни в чем не разбираясь, с помощью чат жпт, то в непопулярном автохотки без вникания во все эти азы стало нельзя.

22

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Ну, джава на порядок сложнее, чем AHK v2, не уверен, что это хороший пример. Скорее тут джаваскрипт ближе, хотя и он сложнее в несколько раз.
Кроме определений в справке есть ведь примеры, можно понять материал, просто запуская их.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23 (изменено: Вася_01, 2024-06-16 23:25:16)

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Malcev пишет:

возможно не собираются ими становиться

Не не собираются, а немогут ими стать.

24 (изменено: Vitalkerrain, 2024-06-21 14:58:13)

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Нормально так вы тут нафлудили конечно.

По теме, оставлю для потомков простой рабочий код записи/чтения CheckBox "на лету" (без кнопки сохранить) в файл. С установкой флажков в CheckBox GUI из ini файла.

#Requires AutoHotkey v2.0

; Чтобы каждый раз не писать название файла с настройками и путь к нему, присваиваем переменной ini путь и название файла
; Если рядом со скриптом не существует файл с настройками, то создать и запись данные по умолчанию
if !FileExist(ini := A_ScriptDir "\Settings.ini")
    {
        Iniwrite 0, ini, "Checkboxes", "Checkbox1" ; Присваиваем нашим переменным 0 (флажок опущен)
        Iniwrite 0, ini, "Checkboxes", "Checkbox2"
        Iniwrite 0, ini, "Checkboxes", "Checkbox3"
    }

myGui := Gui(, "Тест")
myGui.Add("Text",, "Что будите заказывать?")
(Checkbox1 := myGui.Add("Checkbox",, "Кофе")).OnEvent("Click", Save) ; Присваиваем переменную чекбокусу и при нажатии сохраняем данные
(Checkbox2 := myGui.Add("Checkbox",, "Круассан")).OnEvent("Click", Save)
(Checkbox3 := myGui.Add("Checkbox",, "Батончик")).OnEvent("Click", Save)
myGui.Add("Button",, "Проверка заказа").OnEvent("Click", Proverka)
__Checkbox1 := IniRead(ini, "Checkboxes", "Checkbox1") ; В переменную __Checkbox1 читаем из файла значение чекбокса
if __Checkbox1                                       ; Если __Checkbox1 > 0 или не равен 0
    ControlSetChecked 1, Checkbox1                   ; тогда установить флажок

__Checkbox2 := IniRead(ini, "Checkboxes", "Checkbox2")
if __Checkbox2
    ControlSetChecked 1, Checkbox2

__Checkbox3 := IniRead(ini, "Checkboxes", "Checkbox3")
if __Checkbox3
    ControlSetChecked 1, Checkbox3

MyGui.OnEvent("Close", (*) => ExitApp()) ; при закрытии окна сохранить и закрыть
myGui.Show()



Save(*) ; обязателен параметр *
{
    IniWrite(Checkbox1.Value, ini, "Checkboxes", "Checkbox1") ; Запись значения переменной в файл
    IniWrite(Checkbox2.Value, ini, "Checkboxes", "Checkbox2")
    IniWrite(Checkbox3.Value, ini, "Checkboxes", "Checkbox3")
}

Proverka(*)
{
MsgBox "Вы заказали:" "`nКофе = " Checkbox1.value "`nКруассан = " Checkbox2.value "`nБатончик = " Checkbox3.value ; `n - это отступ строки
}

25 (изменено: Vitalkerrain, 2024-06-21 14:57:43)

Re: AHK v2: установка флажков в CheckBox GUI из ini файла

Флуд. По небольшому опыту в v2 скажу, что он на порядок лучше, приятней, логичней и проще, чем v1. Я написал массивный скрипт для своего предприятия. И точно уверен в своих словах. Сам V2 стал, так сказать более правильным и стабильным. Большая сложность именно в переходе с V1, запомнить какие методы пришли на смену старым, где ставить какие знаки. Постоянно ловил ошибку, о том что поставил где-то запятую, которая больше не нужна. Например "Sleep, 75".
Считаю что, если только начинаете учить V1, бросайте, учите сразу V2.

Интересно, что AHK теперь недодумывает за вас многие вещи, так например я по нажатии галочки создавал ярлык скрипта в папке автозапуска, при снятии удалял его. И если файл не существует, но вы попытаетесь его "удалить", то скрипт получит ошибку, не могу это сделать, так как файл не существует. Класс.