Учебник по autoit 2. Версия 12

Я написал так или иначе два авторских листа ущербного учебника.Почему я считаю,что составленный учебник ущербный?Всё основано на том,что я давно принижению себя и нужно изжить этот момент,но я пока не знаю как.Теперь же я хочу продолжить ущербный учебник - сделать вторую часть.Смогу ли я написать еще один авторский лист и появятся ли новые технические идеи,которые можно реализовать на autoit.
Autoit - хороший язык программирования,но единственный его минус в том,как говорил в первой части учебника,что он имеет интерпретатор,который работает только в windows.
Интересно,может ли autoit выполняться  в линукс под вайном - wine?

В первой части учебника я не использовал тайм-аут функции Msgbox.
Данная autoit-программа простая,но она в наглядной форме показывает использование тайм-аута и приращение целочисленной переменной.
#include <MsgBoxConstants.au3>
Local $counter = 0
While 1
MsgBox($MB_SYSTEMMODAL, "Отображение счётчика", $counter,1)
$counter = $counter + 1
if $counter > 10 then Exit
WEnd

Раньше я считал,что объёмные тексты говорят об уме,но сейчас я склоняюсь к мысли,что объём неважен,а необходимо качество.
Чтобы твой читатель действительно чему-либо у тебя научился - нужно писать не количественно,а качественно.
Любая интересная подача материала  должна быть логически-обоснованной и строится от легкого уровня к сложному уровню.Но это к идеале!

В языках программирования существует такое понятие,как область видимости переменной.В autoit явно определять области видимости можно с помощью оператором Local и Global.


#include <MsgBoxConstants.au3>
Local $number_1 = 1
Global $number_2 = 2

MsgBox($MB_SYSTEMMODAL, "$number_1", $number_1)
MsgBox($MB_SYSTEMMODAL, "$number_2", $number_2)

В данном случае операторы Local и Global действуют идентично и ничем в общем сильно не отличаются.

Я привёл некоторый тест областей видимостей.

Файл TestScript.au3
#include <MsgBoxConstants.au3>
#include "GlobalFile.au3"
Local $number_1 = 3

MsgBox($MB_SYSTEMMODAL, "$number_1", $number_1)
MsgBox($MB_SYSTEMMODAL, "$number_2", $number_2)


Файл  GlobalFile.au3
Local $number_1 = 1
Global $number_2 = 2

Переменная $number_1 из файла TestScript.au3 перекрывает переменную $number_1 из файла  GlobalFile.au3.Присвоение переменной $number_1 значения из файла TestScript.au3 берёт верх над присвоением в файле GlobalFile.au3.Этот пример описывает один из механизмов области видимости.На самом деле писать большие программы используют в своей работе области видимости,так как это очень удобно для реализации алгоритмов.

Файл TestScript.au3
Global $number = 1
#include <MsgBoxConstants.au3>
#include "LocalFile.au3"
MsgBox($MB_SYSTEMMODAL, "$number", $number)


Файл  LocalFile.au3
Local $number = 2
MsgBox($MB_SYSTEMMODAL, "$number", $number)

Переменная $number из файла TestScript.au3 переопределяется переменной из файла  LocalFile.au3.Поэтому я пока не вижу разницы работы операторов Local и Global.Локальная переменная одного файла не должна перекрывать глобальную переменную из главного файла.Но из теста понятно,что это не относится к интерпретатору autoit.

Иными словами,переопределение зависит от того,в каком месте находится оператор Local c переменной.Только второе присвоение и будет определять значение.

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

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

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

Возможно,что я слишком утрирую говоря,что операторы сравнения не являются сложными для изучения и понимания.Но точно это не самая сложная тема в программировании.

Данный учебник конечно не имеет строгой и последовательной структуры,не идёт от простого к сложному и даже представляет собой мешанину из знаний.

У меня появилась небольшая техническая идея - создать аналог ярлыка windows.

#include <GUIConstantsEx.au3>
#include <FileConstants.au3>
Local $hGUI = GUICreate("autoit-ярлык")

Local $Label_1 = GUICtrlCreateLabel("Путь к исполняемой программе",0,0)
Local $path_program = GUICtrlCreateInput("C:\Program
Local $idRun = GUICtrlCreateButton("Создать autoit-ярлык", 0, 120, 400, 25)

GUISetState(@SW_SHOW, $hGUI)

While 1

$msg = GUIGetMsg()
if $msg = $idRun then
Local $sFileSaveDialog = FileSaveDialog("Создание ярлыка", @ScriptDir, "Имя autoit-ярлыка (*.au3*)")
Local $hFileOpen = FileOpen($sFileSaveDialog & ".au3", $FO_APPEND)
Local $command = "Run(" & '"' & GUICtrlRead($path_program) & '"'&")"
 FileWriteLine($hFileOpen, $command )
endif
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

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



#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Local $Form1 = GUICreate("Менеджер паролей")

Local $idPasswordMenu = GUICtrlCreateMenu("&Пароли")
Local $idPasswordItem = GUICtrlCreateMenuItem("Генерация паролей", $idPasswordMenu)

GUISetState(@SW_SHOW, $Form1)

While 1

Local $msg = GUIGetMsg()
if $msg = $idPasswordItem then
ChildForm1()
endif
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

Func ChildForm1()
Local $Form2 = GUICreate("Создание пароля", 300, 350)
Local $Input1 = GUICtrlCreateInput("", 0, 0, 300, 21)
$Button1 = GUICtrlCreateButton("Генерировать пароль", 0, 30, 300, 25)
GUISetState(@SW_SHOW,$Form2)
While 1
Local $childmsg = GUIGetMsg()
if $childmsg = $GUI_EVENT_CLOSE Then
GUIDelete($Form2)
ExitLoop
EndIf
if $childmsg = $Button1 Then
Local $password = ""
for $i = 0 to 10
$Letter = Chr(Random(Asc("a"), Asc("z"), 1))
$password &=$Letter
next
GUICtrlSetData($Input1,"")
GUICtrlSetData($Input1,$password)
EndIf
WEnd

EndFunc

Это autoit-программа демонстрирует использование дополнительных окон.Я долго искал ошибку и никак не мог понять,где она.Но эта ошибка имела под собой логическую основу - я использовал одно название переменной для возвращения значения функции GUIGetMsg() - $msg,как в главном потоке программы,так и в собственной функции ChildForm1().


#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <FileConstants.au3>

Local $Form1 = GUICreate("Менеджер паролей")

Local $idPasswordMenu = GUICtrlCreateMenu("&Пароли")
Local $idPasswordItem = GUICtrlCreateMenuItem("Генерация паролей", $idPasswordMenu)

GUISetState(@SW_SHOW, $Form1)

While 1

Local $msg = GUIGetMsg()
if $msg = $idPasswordItem then
ChildForm1()
endif
if  $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif

WEnd

Func ChildForm1()
Local $Form2 = GUICreate("Создание пароля", 300, 350)
Local $Input1 = GUICtrlCreateInput("", 0, 0, 300, 21)
Local $Button1 = GUICtrlCreateButton("Генерировать пароль", 0, 30, 300, 25)
Local $Button2 = GUICtrlCreateButton("Сохранить пароль в password.txt", 0, 60, 300, 25)
GUISetState(@SW_SHOW,$Form2)
While 1
$childmsg = GUIGetMsg()
if $childmsg = $GUI_EVENT_CLOSE Then
GUIDelete($Form2)
ExitLoop
EndIf
if $childmsg = $Button1 Then
Local $password = ""
for $i = 0 to 10
$Letter = Chr(Random(Asc("a"), Asc("z"), 1))
$password &=$Letter
next
GUICtrlSetData($Input1,"")
GUICtrlSetData($Input1,$password)
EndIf
if $childmsg = $Button2 Then
if FindPassword(GUICtrlRead($Input1)) = 1 then
msgbox(0,"Сообщение о пароле","Данный пароль " & GUICtrlRead($Input1) & " существует")
Else
Local $hFileOpen = FileOpen("password.txt", $FO_APPEND)
FileWriteLine($hFileOpen,GUICtrlRead($Input1))
msgbox(0,"Сообщение о пароле","Пароль " & GUICtrlRead($Input1) & " добавлен в password.txt")

EndIf

EndIf
WEnd
Endfunc


Func FindPassword($textpassword)
Local $hFileOpen = FileOpen("password.txt", $FO_READ)
Local $counter = 1
while 1
if FileReadLine($hFileOpen,$counter) = $textpassword then return 1
if @error = -1 then
return 2
EndIf
$counter = $counter + 1
WEnd
EndFunc

Данная autoit-программа позволяет добавлять только уникальные пароли.


Рецензии