Пишу калькулятор на AutoHotKeys

10.4.2020 - 3163 просмотрa ;)

решил написать калькулятор типа как jcalc.jkeks.ru
т.е.

  • поле ввода
  • вычисление происходит автоматически
  • история расчетов по нажатии на Интер
  • так же по нажатию спрашивается комментарий
  • автоматом к комментарию добавляется дата и время
  • Все это дело видно в виде лога

Зачем делать еще один такой калькулятор ?

Потому что вести историю расчетов иногда на сайте ссыкотно, зачем показывать где-то свои расчеты, даже если расчеты не сливаются. Короче в AUTOHOTKEYS скрипте все это дело будет гарантированно никуда не сливаться, т.к. исходник открытый а калькулятор мегаполезный. Так же решается проблема создания бэкапов, т.к. достаточно скопировать файлик, оно может происходить автоматом. А в случае с сайтом это нетривиальная операция. К тому же локалторадж браузера привязан к браузеру, и пересаживание на другой комп гарантированно прибьет историю как и пересаживание за другой браузер, да даже случаое стирание данных истории уже совершит коллапс.
Локальный скрипт работает очень быстро
Не требуется интернета для задачи которая не требует интернета )
Ну и конечно же вам в руки попадает вся кастомизация калькулятора, возможно вы захотите раскрасить цвета, поменять шрифты.. изменить функционал, подписать свое авторство.. все это пожалуйста, флаг вам в руки, ну единственно в исходнике нельзя убирать сообщение о том что автор оригинальной идеи и разработки я — jkeks/


Погнали..

Решил накидать дизайн в SmartGUI или AutoGUI.. Получается откровенная лажа. Не приспособлены они оба к созданию макетов, руками в 100 раз быстрее получится.

Как будто бы на HTML все было бы по другому.. тоже руками и ногами рисуем ГУЙ.

Редактор для AutoHotKeys

Редакторы все какие-то не готовые для AutoHotKeys, все потому что в AutoHotKeys можно писать без кавычек, а переменные пишутся в процентовках, поэтому автоподстановка парной процентовки не происходит. Плагин есть для Sublime Text 3, он даже подсказывает что-то, но все безтолку, т.к. слишком все не так в AutoHotKeys.
Короче лучшего варианта чем Scite не нашел, там и запускать удобно и дебажить можно и более менее scintilla знакомое, хотя и старенькая версия scite.

В AutoHotKeys нет eval, сначала я думал обойти это путем задания размеров для гуя и получения результата, потом нашел решение через COM выполнить JavaScript/ Этот вариант самый правильный если можно так сказать, т.к. мы не парсим сами, а отдаем все на откуп умным технологиям. Ошибки практически исключены. Да в AutoHotKeys есть и парсеры выражений, и мне от этого страшно, т.к. в комментариях я встречал примеры которые решались не верно.
Да, был еще вариант, генерить AutoHotKeys код и выполнять отдельным процессом, результат брать через задницу, я не стал использовать такой вариант.

Вообщем-то eval и является ключевым вопросом в разработке калькулятора, все остальное уже почти на автомате.

Генерация формы:

Gui Font, s20 Bold
Gui Add, Edit, x1 y1 w998 h40 vMath
Gui Font, s120 Bold
Gui Add, Text, x10 w998 h160 vResult
Gui Font, s12 Normal
Gui Add, Edit, x1 w998 h568 Multi vLog ,0
Gui Show, w1000 h800, Window

Крупные шрифты, не адаптивный дизайн, все по минималке. Вообще надо сказать AutoHotKeys просто потрясающе малословен. Настолько скромен, что даже скучно стает ).
Это огромное достоинство. С другой стороны я бы конечно сделал более функциональный вид.

Загрузка данных происходит двумя строками:

FileRead, log, math.txt
GuiControl,, Log, %log%

Читаем в переменную и кладем в контрол прочитанное. Проще не бывает. Но меня смущают две запятые )))

Обработка событий:

OnMessage(0x0101, "CheckForKEYUP") ; WM_KEYUP
OnMessage(0x0100, "CheckForKEYDOWN") ; WM_KEYDOWN

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

Функция нажатия, все выглядит приятно, много принимаемых аргументов это по инерции, нам нужен только W.

CheckForKEYDOWN(W, L, M, H) {
if (W=13){

И мы в данной функции отлавливаем только нажатие на Enter

Дальше мы спросим комментарий пользователя если он нажал Интер:

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

Взгляните как работает конкатенация в AutoHotKeys

comment = --%comment%

да никак. нету ее. Точнее сказать переменные обрамлены процентами. Это вообще говоря вывих мозга. т.к. ни один редактор не умеет парные проценты автоматом ставить, приходится рисовать их руками или своим костынем на AutoHotKeys дорисовывать пару, но я пока руками.
Ну и да, это не декремент а просто объединение строк, правильнее привести пример из головы:

Другой обалденный момент AutoHotKeys, это текущая дата, для них как и в Perl есть встроенные переменные.

comment = %comment% %A_DD%.%A_MM%.%A_YYYY%

Не надо создавать объектов и функций. Текущая дата и время всегда во внутренних переменных. Это мегаудобно.

Теперь посмотрим как брать данные из контролов, но сначала вспомним как это делается в каки-нибудь дельфях или Шарпах, типа:

a = Label1.Text

а тут нет, тут это делается через голову:

GuiControlGet, mathText , , Math
GuiControlGet, result , , Result
GuiControlGet, logStr , , Log

Функция, переменная, 2 запятые, имя элемента.. Капец. За это надо отбивать руки конечно.
Но ! Надо учесть что AutoHotKeys точно этой же функцией возьмет текст из любого контрола в Windows. Если сложить это то получится может и ниче. Но я бы честно придумал Дельфи стайл.

Еще почему-то присваивание в AutoHotKeys иногда происходит через := а иногда через = т оператор сравнения тоже =
А вот как выглядит перенос строки: `n а не \n

Ображение к компонентам на запись выглядит так:

GuiControl,, Log, %logStr%

где

  • GuiControl-команда
  • Log — компонент
  • %logStr% — переменная

«Чужие для Хищников»

А вот так выглядит процесс записи в файл:

FileDelete, math.txt
FileAppend, %logStr%, math.txt

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

Далее очень простая процедурка выхода из программы:

По нажатию ESC или крестика, спрашивается что хотим ли мы действительно выйти.

AutoHotKeys имеет 2 вида функций, есть классические и как бы процедурные что ли. Дак вот эти процедурные может имеют какие-то названия я еще не понял, но они определяются как в коде выше, название и двоеточие. Такие функции могут быть и ванлайнерами если там всего одна команда, это очень удобно. Никакой говностиль который обрел мир в виде стрелочных функций не сравнится )

После написания калькулятора мои впечатления от AutoHotKeys двоякие.

Код короткий, малословный, но кое-что все же решается очень премудрыми способами
Исходник сам по себе одинок, нет никаких

Статьи из раздела, Видеочат рулетка