Я написал так или иначе два авторских листа ущербного учебника.Почему я считаю,что составленный учебник ущербный?Всё основано на том,что я давно принижению себя и нужно изжить этот момент,но я пока не знаю как.Теперь же я хочу продолжить ущербный учебник - сделать вторую часть.Смогу ли я написать еще один авторский лист и появятся ли новые технические идеи,которые можно реализовать на 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 Files\Google\Chrome\Application\chrome.exe",0,30,400,25)
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-программа позволяет добавлять только уникальные пароли.
Интересный технический момент - эта программа зависает тогда,когда в рабочей директории нет файла password.txt.Поэтому в исходный код нужно добавить код,который будет определять есть ли файл password.txt и если нет,то создавать.
#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)
GUICtrlCreateLabel("Пароль", 0, 0)
Local $Input1 = GUICtrlCreateInput("", 0, 50, 300, 21)
Local $Button1 = GUICtrlCreateButton("Генерировать пароль", 0, 100, 300, 25)
GUICtrlCreateLabel("Категории паролей", 10,150)
Local $Input2 = GUICtrlCreateInput("Категория 1", 0, 200, 300, 21)
Local $Button2 = GUICtrlCreateButton("Сохранить пароль в password.txt", 0, 250, 300, 25)
Local $Button3 = GUICtrlCreateButton("Сохранить катогорию в catogory.txt", 0, 300, 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 FindWord(GUICtrlRead($Input1),"password.txt") = 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
if $childmsg = $Button3 Then
if FindWord(GUICtrlRead($Input2),"category.txt") = 1 then
msgbox(0,"Сообщение о категории","Категория " & GUICtrlRead($Input2) & " существует")
Else
Local $hFileOpen = FileOpen("category.txt", $FO_APPEND)
FileWriteLine($hFileOpen,GUICtrlRead($Input2))
msgbox(0,"Сообщение о категории","Категория " & GUICtrlRead($Input2) & " добавлена в category.txt")
EndIf
EndIf
WEnd
Endfunc
Func FindWord($textword,$filename)
Local $hFileOpen = FileOpen($filename, $FO_READ)
Local $counter = 1
while 1
if FileReadLine($hFileOpen,$counter) = $textword then return 1
if @error = -1 then
return 2
EndIf
$counter = $counter + 1
WEnd
EndFunc
Для любого пароля нужно указать категорию.Категорией я называю назначение пароля.Вспоследствие определение "категория" можно изменить,для менеджера паролей - это несущественно.Главное функции,которые в него вложены.
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <FileConstants.au3>
Local $Form1 = GUICreate("Менеджер паролей")
Local $idPasswordMenu = GUICtrlCreateMenu("&Пароли")
Local $idPasswordItem = GUICtrlCreateMenuItem("Генерация паролей", $idPasswordMenu)
GUICtrlCreateLabel("Категории паролей", 10, 10)
Local $idComboBox = GUICtrlCreateCombo("", 10, 40, 350, 20)
Local $hFileOpen = FileOpen("category.txt", $FO_READ)
Local $counter = 1
Local $category =""
while 1
$category &= FileReadLine($hFileOpen,$counter) & "|"
if @error = -1 then ExitLoop
$counter = $counter + 1
WEnd
GUICtrlSetData($idComboBox, $category)
Local $idButtonPasssword = GUICtrlCreateButton("получить пароль", 120, 70, 100, 25)
GUICtrlCreateLabel("Запрошенный пароль", 10, 100)
Local $idPassword = GUICtrlCreateInput("", 10, 140, 350, 20)
GUISetState(@SW_SHOW, $Form1)
While 1
Local $msg = GUIGetMsg()
if $msg = $idPasswordItem then
ChildForm1()
endif
if $msg = $idButtonPasssword then
Local $value_1 = FindWord(GUICtrlRead($idComboBox),"category.txt")
Local $hFileOpen = FileOpen("password.txt", $FO_READ)
Local $value_2 = FileReadLine($hFileOpen,$value_1)
GUICtrlSetData($idPassword,$value_2)
endif
if $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif
WEnd
Func ChildForm1()
Local $Form2 = GUICreate("Создание пароля", 300, 350)
GUICtrlCreateLabel("Пароль", 0, 0)
Local $Input1 = GUICtrlCreateInput("", 0, 50, 300, 21)
Local $Button1 = GUICtrlCreateButton("Генерировать пароль", 0, 100, 300, 25)
GUICtrlCreateLabel("Категории паролей", 10,150)
Local $Input2 = GUICtrlCreateInput("Категория 1", 0, 200, 300, 21)
Local $Button2 = GUICtrlCreateButton("Сохранить пароль в password.txt", 0, 250, 300, 25)
Local $Button3 = GUICtrlCreateButton("Сохранить катогорию в category.txt", 0, 300, 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 FindWord(GUICtrlRead($Input1),"password.txt") <> -1 then
msgbox(0,"Сообщение о пароле","Данный пароль " & GUICtrlRead($Input1) & " существует")
Else
Local $hFileOpen = FileOpen("password.txt", $FO_APPEND)
if GUICtrlRead($Input1) <> "" then FileWriteLine($hFileOpen,GUICtrlRead($Input1))
msgbox(0,"Сообщение о пароле","Пароль " & GUICtrlRead($Input1) & " добавлен в password.txt")
EndIf
EndIf
if $childmsg = $Button3 Then
if FindWord(GUICtrlRead($Input2),"category.txt") <> -1 then
msgbox(0,"Сообщение о категории","Категория " & GUICtrlRead($Input2) & " существует")
Else
Local $hFileOpen = FileOpen("category.txt", $FO_APPEND)
if GUICtrlRead($Input2) <> "" then FileWriteLine($hFileOpen,GUICtrlRead($Input2))
msgbox(0,"Сообщение о категории","Категория " & GUICtrlRead($Input2) & " добавлена в category.txt")
EndIf
EndIf
WEnd
Endfunc
Func FindWord($textword,$filename)
Local $hFileOpen = FileOpen($filename, $FO_READ)
Local $counter = 1
while 1
if FileReadLine($hFileOpen,$counter) = $textword then return $counter
if @error = -1 then
return -1
EndIf
$counter = $counter + 1
WEnd
EndFunc
Теперь можно по названию категории получить пароль.
Функция FindWord открывает файл и возвращает номер строки,если таковая действительно существует,иначе возвращает - 1.
Есть одна проблема - сразу не обновляется список категорий в главном окне программы ,эту функциональность еще нужно реализовать.
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <FileConstants.au3>
#include <GuiComboBox.au3>
Local $Form1 = GUICreate("Менеджер паролей")
Local $idPasswordMenu = GUICtrlCreateMenu("&Пароли")
Local $idPasswordItem = GUICtrlCreateMenuItem("Генерация паролей", $idPasswordMenu)
GUICtrlCreateLabel("Категории паролей", 10, 10)
Local $idComboBox = GUICtrlCreateCombo("", 10, 40, 350, 20)
AddCategory()
Local $idButtonPasssword = GUICtrlCreateButton("получить пароль", 120, 70, 100, 25)
GUICtrlCreateLabel("Запрошенный пароль", 10, 100)
Local $idPassword = GUICtrlCreateInput("", 10, 140, 350, 20)
GUISetState(@SW_SHOW, $Form1)
While 1
Local $msg = GUIGetMsg()
if $msg = $idPasswordItem then
ChildForm1()
endif
if $msg = $idButtonPasssword then
Local $textcategory = GUICtrlRead($idComboBox)
AddCategory()
GUICtrlSetData($idComboBox,$textcategory)
Local $value_1 = FindWord($textcategory,"category.txt")
Local $hFileOpen = FileOpen("password.txt", $FO_READ)
Local $value_2 = FileReadLine($hFileOpen,$value_1)
GUICtrlSetData($idPassword,$value_2)
endif
if $msg = $GUI_EVENT_CLOSE then
ExitLoop
endif
WEnd
Func ChildForm1()
Local $Form2 = GUICreate("Создание пароля", 300, 350)
GUICtrlCreateLabel("Пароль", 0, 0)
Local $Input1 = GUICtrlCreateInput("", 0, 50, 300, 21)
Local $Button1 = GUICtrlCreateButton("Генерировать пароль", 0, 100, 300, 25)
GUICtrlCreateLabel("Категории паролей", 10,150)
Local $Input2 = GUICtrlCreateInput("Категория 1", 0, 200, 300, 21)
Local $Button2 = GUICtrlCreateButton("Сохранить пароль в password.txt", 0, 250, 300, 25)
Local $Button3 = GUICtrlCreateButton("Сохранить катогорию в category.txt", 0, 300, 300, 25)
GUISetState(@SW_SHOW,$Form2)
While 1
$childmsg = GUIGetMsg()
if $childmsg = $GUI_EVENT_CLOSE Then
AddCategory()
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 FindWord(GUICtrlRead($Input1),"password.txt") <> -1 then
msgbox(0,"Сообщение о пароле","Данный пароль " & GUICtrlRead($Input1) & " существует")
Else
Local $hFileOpen = FileOpen("password.txt", $FO_APPEND)
if GUICtrlRead($Input1) <> "" then FileWriteLine($hFileOpen,GUICtrlRead($Input1))
msgbox(0,"Сообщение о пароле","Пароль " & GUICtrlRead($Input1) & " добавлен в password.txt")
EndIf
EndIf
if $childmsg = $Button3 Then
if FindWord(GUICtrlRead($Input2),"category.txt") <> -1 then
msgbox(0,"Сообщение о категории","Категория " & GUICtrlRead($Input2) & " существует")
Else
Local $hFileOpen = FileOpen("category.txt", $FO_APPEND)
if GUICtrlRead($Input2) <> "" then FileWriteLine($hFileOpen,GUICtrlRead($Input2))
msgbox(0,"Сообщение о категории","Категория " & GUICtrlRead($Input2) & " добавлена в category.txt")
EndIf
EndIf
WEnd
Endfunc
Func FindWord($textword,$filename)
Local $hFileOpen = FileOpen($filename, $FO_READ)
Local $counter = 1
while 1
if FileReadLine($hFileOpen,$counter) = $textword then return $counter
if @error = -1 then
return -1
EndIf
$counter = $counter + 1
WEnd
EndFunc
Func AddCategory()
Local $hFileOpen = FileOpen("category.txt", $FO_READ)
Local $counter = 1
Local $category =""
while 1
$category &= FileReadLine($hFileOpen,$counter) & "|"
if @error = -1 then ExitLoop
$counter = $counter + 1
WEnd
$category = StringMid($category,2)
_GUICtrlComboBox_ResetContent($idComboBox)
GUICtrlSetData($idComboBox, $category)
EndFunc
Создал функцию AddCategory(),которая добавляет список категорий на лету.Иногда необходимо сохранять значения функции GUICtrlRead в отдельные переменные.Эта autoit-программа именно тот самый случай.
|