[ Обновленные темы · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 6
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Модератор форума: Andrey_A, ХарВик, chip642  
Форум » • Общение Пользователей • » Секреты мастерства » Скриптинг на AUTOIT (Учимся писать скрипты на Autoit и делимся опытом)
Скриптинг на AUTOIT
asmadeusДата: Понедельник, 16.12.2013, 16:44 | Сообщение № 1
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Скриптинг на AUTOIT




Тема для вопросов и ответов по написанию скриптов на autoit'e - стремительно набирающем популярность языке автоматизации выполнения рутинных дел при работе на компьютере.


Сообщение отредактировал asmadeus - Суббота, 01.02.2014, 23:01
 
asmadeusДата: Суббота, 02.08.2014, 23:33 | Сообщение № 31
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Опять я со своими пятью копейками...
Как быть, если одинаковые функции выпоняют одинаковые действия, но с разными переменными? Можно как то спростить такое? Вот например
Код

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
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 125
Аверин Андрей
Цитата asmadeus ()
упростить существующее.

Пока не сильно понятно... необходимо выложить как минимум 2 функции чтобы понять на 100%


 
asmadeusДата: Воскресенье, 03.08.2014, 15:38 | Сообщение № 33
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Цитата 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
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 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
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
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
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 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
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
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
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Так, я опять здесь. Ситуация такова - на форме три чекбокса. Надо считать состояние (выделен или нет), если выделяю или если сним аю флажок, и в зависимости от этого заменять строку в файле текстовом (не ини).Ну и сохранять.
Строка типа -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
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 125
Аверин Андрей
Цитата asmadeus ()
Если я делаю более трех действий, то переменная переполняется

Перед циклом очищай переменную

Код
$rad=''


 
asmadeusДата: Воскресенье, 24.08.2014, 14:28 | Сообщение № 40
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Цитата Andrey_A ()
Перед циклом очищай переменную

Я ставил за циклом))
 
Andrey_AДата: Воскресенье, 31.08.2014, 19:58 | Сообщение № 41
Генералиссимус

На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 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
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Andrey_A, заценим, а то разные кнопки напрягают - лично я не всегда помню, где у меня в коде массив, а где строка. вот только проблема - ты не выложишь библиотеку, а то у меня кнопки эти без иконок
 
Andrey_AДата: Воскресенье, 31.08.2014, 23:23 | Сообщение № 43
Генералиссимус

На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 125
Аверин Андрей
Цитата asmadeus ()
ты не выложишь библиотеку, а то у меня кнопки эти без иконок

Можно и библиотеку AkelPadImage_dll.zip


 
asmadeusДата: Понедельник, 01.09.2014, 08:07 | Сообщение № 44
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Andrey_A, забрал,спасибо
 
asmadeusДата: Четверг, 27.11.2014, 19:01 | Сообщение № 45
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
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 все работает. Как решить вопрос, если его можно решить
 
Форум » • Общение Пользователей • » Секреты мастерства » Скриптинг на AUTOIT (Учимся писать скрипты на Autoit и делимся опытом)
  • Страница 3 из 6
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Поиск:

Интеллектуальные права и отказ от ответственности