Скриптинг на AUTOIT
|
|
asmadeus | Дата: Понедельник, 16.12.2013, 16:44 | Сообщение № 1 |
|
Скриптинг на AUTOIT
Тема для вопросов и ответов по написанию скриптов на autoit'e - стремительно набирающем популярность языке автоматизации выполнения рутинных дел при работе на компьютере.
Сообщение отредактировал asmadeus - Суббота, 01.02.2014, 23:01 |
|
| |
asmadeus | Дата: Суббота, 02.08.2014, 23:33 | Сообщение № 31 |
|
Опять я со своими пятью копейками... Как быть, если одинаковые функции выпоняют одинаковые действия, но с разными переменными? Можно как то спростить такое? Вот например Код Func _daz_vl($N) $Vl_date=IniRead($stat, "Date", "Vl", "") If $Vl_date = _NowCalcDate() then MsgBox(4096,"Ошибка!","Операция выполнена!") else If GUICtrlRead($Input_vl[$N])=0 then GUICtrlSetData($Input_vl[$N],GUICtrlRead($Input_vl[$N-1])) Else GUICtrlSetData($Input_vl[$N],GUICtrlRead($Input_vl[$N])+1) EndIf GUICtrlSetBkColor($Input_vl[$N],0xF0F0F0) If $N=$Vl[0][0] then GUICtrlSetBkColor($Input_vl[1],0xFF0000) else GUICtrlSetBkColor($Input_vl[$N+1],0xFF0000) EndIf Iniwrite($stat,"Vl",$Vl[$N][0],GUICtrlRead($Input_vl[$N])) Iniwrite($stat,"Date","Vl", _NowCalcDate()) $Persaq=GUICtrlRead($Label_vl[$N]) GUICtrlSetData($Edit1,GUICtrlRead($Edit1)&$Persaq&" выполнил задачу"&@CRLF) Endif EndFunc В других функциях то же самое, только другая группа и вместо vl стоит tr, mn, lt, st Вот и вопрос - как заменить часть переменной и собственно передать ее в функцию, удалив тем самым остальные? Да и вообще упростить существующее.
Сообщение отредактировал asmadeus - Воскресенье, 03.08.2014, 15:37 |
|
| |
Andrey_A | Дата: Воскресенье, 03.08.2014, 02:53 | Сообщение № 32 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7186
Награды: 143
Репутация: 125
Аверин Андрей
|
Цитата asmadeus ( ) упростить существующее. Пока не сильно понятно... необходимо выложить как минимум 2 функции чтобы понять на 100%
|
|
| |
asmadeus | Дата: Воскресенье, 03.08.2014, 15:38 | Сообщение № 33 |
|
Цитата Andrey_A ( ) необходимо выложить как минимум 2 функции вот вторая. первая в предыдущем моем посте. Код Func _daz_tr($N) $Tr_date=IniRead($stat, "Date", "Tr", "") If $Tr_date = _NowCalcDate() then MsgBox(4096,"Ошибка!","Операция выполнена!") else If GUICtrlRead($Input_tr[$N])=0 then GUICtrlSetData($Input_tr[$N],GUICtrlRead($Input_tr[$N-1])) Else GUICtrlSetData($Input_tr[$N],GUICtrlRead($Input_tr[$N])+1) EndIf GUICtrlSetBkColor($Input_tr[$N],0xF0F0F0) If $N=$Tr[0][0] then GUICtrlSetBkColor($Input_tr[1],0xFF0000) else GUICtrlSetBkColor($Input_tr[$N+1],0xFF0000) EndIf Iniwrite($stat,"Tr",$Tr[$N][0],GUICtrlRead($Input_tr[$N])) Iniwrite($stat,"Date","Tr", _NowCalcDate()) $Persaq=GUICtrlRead($Label_tr[$N]) GUICtrlSetData($Edit1,GUICtrlRead($Edit1)&$Persaq&" выполнил задачу"&@CRLF) Endif EndFunc
Сообщение отредактировал asmadeus - Воскресенье, 03.08.2014, 15:40 |
|
| |
Andrey_A | Дата: Воскресенье, 03.08.2014, 19:35 | Сообщение № 34 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7186
Награды: 143
Репутация: 125
Аверин Андрей
|
asmadeus, если ничего не пропустил, то так... не тестировал, т.к. требуются все объекты, просто визуально заменил общее:
Код _daz_all($N,"Vl",$Input_vl,$Label_vl,$Vl) _daz_all($N,"Tr",$Input_tr,$Label_tr,$Tr)
Func _daz_all($nNum,$sName,$aInput_all,$aLabel_all,$aAll) $date=IniRead($stat,"Date",$sName,"") If $date=_NowCalcDate() Then MsgBox(4096,"Ошибка!","Операция выполнена!") Else If GUICtrlRead($aInput_all[$nNum])=0 Then GUICtrlSetData($aInput_all[$nNum],GUICtrlRead($aInput_all[$nNum-1])) Else GUICtrlSetData($aInput_all[$nNum],GUICtrlRead($aInput_all[$nNum])+1) EndIf GUICtrlSetBkColor($aInput_all[$nNum],0xF0F0F0) If $nNum=$aAll[0][0] Then GUICtrlSetBkColor($aInput_all[1],0xFF0000) Else GUICtrlSetBkColor($aInput_all[$nNum+1],0xFF0000) EndIf IniWrite($stat,$sName,$aAll[$nNum][0],GUICtrlRead($aInput_all[$nNum])) IniWrite($stat,"Date",$sName, _NowCalcDate()) $Persaq=GUICtrlRead($aLabel_all[$nNum]) GUICtrlSetData($Edit1,GUICtrlRead($Edit1)&$Persaq&" выполнил задачу"&@CRLF) EndIf EndFunc
[ps]Лучше свои скрипты "причёсывать" (структурировать) и переменные рекомендуется называть так, чтобы было понятно, где массив, где строка... - в справке есть раздел "Обучение" - "Аккуратность скрипта"[/ps]
|
|
| |
asmadeus | Дата: Понедельник, 04.08.2014, 16:12 | Сообщение № 35 |
|
Andrey_A, код рабочий, но тут потребовалась доработка - обнаружил доселе невыявленную ошибку... Итак, вопрос -как проверить, что все элементы массива равны нулю (именно все). В коде вот этот участок Код If GUICtrlRead($aInput_all[$nNum])<>0 OR СЮДА НУЖНА ПРОВЕРКА НА ТО, ЧТО ВСЕ ЭЛЕМЕНТЫ В ПОЛЯХ ВВОДА РАВНЫ НУЛЮ Then GUICtrlSetData($aInput_all[$nNum],GUICtrlRead($aInput_all[$nNum])+1) Else GUICtrlSetData($aInput_all[$nNum],GUICtrlRead($aInput_all[$nNum-1])) EndIf
|
|
| |
Andrey_A | Дата: Вторник, 05.08.2014, 03:06 | Сообщение № 36 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7186
Награды: 143
Репутация: 125
Аверин Андрей
|
Цитата asmadeus ( ) как проверить, что все элементы массива равны нулю
Код #include <Array.au3> ; пример 1 Dim $aArray[5]=[0,0,0,0,0] _ArrayDisplay($aArray,"Массив $aArray") $n=_Is_Array_Ziro($aArray) MsgBox(4096,"Переменная ","$n =>" & $n & "<=") ; пример 2 Dim $aArray[5]=[0,0,0,0,1] _ArrayDisplay($aArray,"Массив $aArray") $n=_Is_Array_Ziro($aArray) MsgBox(4096,"Переменная ","$n =>" & $n & "<=") ; пример 3 $m=1 $n=_Is_Array_Ziro($m) MsgBox(4096,"Переменная ","$n =>" & $n & "<=") ; =========================================================================== ; _Is_Array_Ziro - проверка всех элементов массива: ; возвращает 0, если все элементы массива равны 0 ; возвращает 1, если один из элементов массива не равен 0 ; Ошибка: Возвращает -1, устанавливает @error: ; @error: ; 1 - $avArray не является массивом ; 2 - Массив $avArray не является одномерным ; 4 - $iStart больше $iEnd
; $avArray - Массив для поиска ; $iStart - [необязательный] Индекс массива, от которого начинать поиск ; $iEnd - [необязательный] Индекс массива, в котором закончить поиск ; $iForward - [необязательный] Если установлено в 0, то искать в массиве от конца к началу (а не от начала к концу) ; =========================================================================== Func _Is_Array_Ziro($avArray,$iStart=0,$iEnd=0,$iCase=0,$iForward=1) If Not IsArray($avArray) Then Return SetError(1,0,-1) If UBound($avArray,0)<1 Then Return SetError(2,0,-1) $iUBound=UBound($avArray)-1 If $iEnd<1 Or $iEnd>$iUBound Then $iEnd=$iUBound If $iStart<0 Then $iStart=0 If $iStart>$iEnd Then Return SetError(4,0,-1) $iStep=1 If Not $iForward Then $iTmp=$iStart $iStart=$iEnd $iEnd=$iTmp $iStep=-1 EndIf For $i=$iStart To $iEnd Step $iStep If $avArray[$i]<>0 Then Return 1 Next Return 0 EndFunc
|
|
| |
asmadeus | Дата: Вторник, 05.08.2014, 13:59 | Сообщение № 37 |
|
Andrey_A, спасибо, я реализовал так. Вроде работает, хотя еще тестирую.. Код Func _zero($nNum, $aAll,$sZnach) For $nNum=1 To $aAll[0][0] If $aAll[$nNum][1]=0 Then $sZnach&="0" Next If StringLen($sZnach)= $aAll[0][0] Then return 1 EndFunc
|
|
| |
asmadeus | Дата: Суббота, 23.08.2014, 21:55 | Сообщение № 38 |
|
Так, я опять здесь. Ситуация такова - на форме три чекбокса. Надо считать состояние (выделен или нет), если выделяю или если сним аю флажок, и в зависимости от этого заменять строку в файле текстовом (не ини).Ну и сохранять. Строка типа -0,1,0. Ну не выделен, выделен, не выделен. Пробовал так Код For $i=1 To 3 If GUICtrlRead($Vkluch[$i])=$GUI_CHECKED Then $rad&="1," Else $rad&="0," EndIf Next MsgBox(4096, "Переменная ", "Файл: Scripted.au3 :: Строка: 106" & @CRLF & "$rad =>" & $rad & "<=") Но не врублюсь, как остаовить это. Если я делаю более трех действий, то переменная переполняется. Или может вообще мыслю неправильно
|
|
| |
Andrey_A | Дата: Суббота, 23.08.2014, 23:10 | Сообщение № 39 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7186
Награды: 143
Репутация: 125
Аверин Андрей
|
Цитата asmadeus ( ) Если я делаю более трех действий, то переменная переполняется Перед циклом очищай переменную
|
|
| |
asmadeus | Дата: Воскресенье, 24.08.2014, 14:28 | Сообщение № 40 |
|
Цитата Andrey_A ( ) Перед циклом очищай переменную Я ставил за циклом))
|
|
| |
Andrey_A | Дата: Воскресенье, 31.08.2014, 19:58 | Сообщение № 41 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7186
Награды: 143
Репутация: 125
Аверин Андрей
|
Просмотр содержимого переменной в скрипте
Код ; ViewValues.au3 ; ======================== Описание ================================== ; === Просмотр содержимого переменной в скрипте: ; STRING - Строковая переменная $sText просматривается в окне EDIT ; INT32 - Целочисленный тип $iIndex просматривается в окне EDIT ; INT64 - 64 битный целый тип $iIndex просматривается в окне EDIT ; DOUBLE - Переменная десятичной дробью с плавающей точкой $fFloat просматривается в окне EDIT ; BINARY - Бинарный тип $dBinary просматривается в окне EDIT ; PTR - Тип данных "указатель" $pPtr просматривается в окне EDIT ; ------------------------------------------------ ; ARRAY - Массив $aArray перенаправляется в функцию _ArrayDisplay() ; MAP - Ассоциативный массив $mMap преобразуется в простой 2D массив ( Key|Value) и перенаправляется в функцию _ArrayDisplay() ; OBJECT - Из типа данных объект извлекается информация объекта в массив и перенаправляется в функцию _ArrayDisplay() ; -- Scripting.Dictionary - если имеются данные, то выводится информация в 2D массиве ($oDict.Keys|$oDict.Items) и перенаправляется в функцию _ArrayDisplay() ; ------------------------------------------------ ; DLLSTRUCT - Структура $tStruct перенаправляется в функцию _WinAPI_DisplayStruct() ; ------------------------------------------------ ; KEYWORD - Тип данных "ключевое слово" $vKeyword выводится сообщение в MsgBox ; BOOL - при булевом тип данных $bBoolean выводится сообщение в MsgBox ; FUNCTION - если переменная является ссылкой на функцию выводится сообщение в MsgBox ; USERFUNCTION - если переменная является ссылкой на функцию пользователя выводится сообщение в MsgBox ; ----------- ; В заголовке отображаемого окна указывается тип переменной ; ======================= Дополнение ================================= ; Функция _AkelList() может быть заменой функции ConsoleWrite() в текстовом редакторе AkelPad ; ======================= Дополнение ================================= ; Для использования необходимо положить в папку ...\AutoIt\Include\ ; ======================= Дополнение ================================= ; В ряде методов(циклы/Event/WM Сообщения/...) возможны проблемы - зависания... т.к. даже простой MsgBox может влиять на обработку событий...
; Автор: Аверин Андрей ; Версия: 1.7 (31.08.2014 - 14.07.2022) ; Mail: Averin-And@yandex.ru ; Site: http://tc-image.3dn.ru/forum/29-896-10469-16-1409500706 ; ========================================================================
#include-once #include <GuiEdit.au3> #include <WinAPIDiag.au3> #include <Array.au3>
скачать ViewValues.au3
Для вставки функции в AkelPad необходим InsertPlus.vbs - Скрипт библиотека различных преобразований текста и вставка
и кнопки:
Код -"AU3 - вставить _ViewValues после переменной" Call("Scripts::Main", 1, "InsertPlus.vbs", `"118" "1"`) Icon("%a\AkelPadImage.dll",1355) -"AU3 - вставить _ViewValues до и после переменной" Call("Scripts::Main", 1, "InsertPlus.vbs", `"118" "3"`) Icon("%a\AkelPadImage.dll",1357) -"AU3 - вставить _ViewValues до переменной" Call("Scripts::Main", 1, "InsertPlus.vbs", `"118" "2"`) Icon("%a\AkelPadImage.dll",1356)
|
|
| |
asmadeus | Дата: Воскресенье, 31.08.2014, 20:11 | Сообщение № 42 |
|
Andrey_A, заценим, а то разные кнопки напрягают - лично я не всегда помню, где у меня в коде массив, а где строка. вот только проблема - ты не выложишь библиотеку, а то у меня кнопки эти без иконок
|
|
| |
Andrey_A | Дата: Воскресенье, 31.08.2014, 23:23 | Сообщение № 43 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7186
Награды: 143
Репутация: 125
Аверин Андрей
|
Цитата asmadeus ( ) ты не выложишь библиотеку, а то у меня кнопки эти без иконок Можно и библиотеку AkelPadImage_dll.zip
|
|
| |
asmadeus | Дата: Понедельник, 01.09.2014, 08:07 | Сообщение № 44 |
|
Andrey_A, забрал,спасибо
|
|
| |
asmadeus | Дата: Четверг, 27.11.2014, 19:01 | Сообщение № 45 |
|
Andrey_A, есть нужда в консультации мастера. На днях решил на ноуте заглянуть в TCMConverter (на ноуте win8x32). Выяснилась картина - он не работает. В ходе первичного осмотра обнаружилось, что не происходит получение абсолютного пути из относительного. То есть - в ini файле настроек прописано Код MENUIMG =%COMMANDER_PATH%\Utils\MENUIMG\MENUIMG.exe При запуске выполняется Код Global $MENUIMG = @ScriptDir & '\MENUIMG.exe' If Not FileExists($MENUIMG) Then $MENUIMG = _Env(IniRead($INICONV, "Path", "MENUIMG", "")) Func _Env($sT) $aR = StringRegExp($sT, "%(\w+)%", 3) If IsArray($aR) Then For $k = 0 To UBound($aR) - 1 $sT = StringReplace($sT, "%" & $aR[$k] & "%", EnvGet($aR[$k])) Next EndIf Return $sT EndFunc ;==>_Env А результат ее работы получает путь без пути к самой папке тотала. То есть я получаю Код \Utils\MENUIMG\MENUIMG.exe вместо того, что должен получить Код g:\Tcase\TCASE\Utils\MENUIMG\MENUIMG.exe На win7 все работает. Как решить вопрос, если его можно решить
|
|
| |
|