Воскресенье, 24.11.2024, 08:33 | Приветствую Вас Гость

...

Блог


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


Я написал так или иначе два авторских листа ущербного учебника.Почему я считаю,что составленный учебник ущербный?Всё основано на том,что я давно принижению себя и нужно изжить этот момент,но я пока не знаю как.Теперь же я хочу продолжить ущербный учебник - сделать вторую часть.Смогу ли я написать еще один авторский лист и появятся ли новые технические идеи,которые можно реализовать на 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-программа именно тот самый случай.

Просмотров: 97 | Добавил: moskov | Рейтинг: 0.0/0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Меню сайта

Мини-чат

Статистика


Онлайн всего: 4
Гостей: 4
Пользователей: 0

Форма входа

Календарь

«  Март 2023  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Архив записей

Друзья сайта

  • ЗОВ КОСМОСА

  • Хулиган Вселенной

  • Тюремная поэзия

  • Религиозная поэзия

  • Сайт клана ЛеГиоН
  • Поиск