Что нового

[Ошибки] Нестабильная работа скрипта

f9n6001

Новичок
Сообщения
15
Репутация
0
В общем, придется мне вам снова надоедать...
Вот такой скрипт:
Код:
;=========================================================================================
Dim $PathConfig, $PathExe
$PathConfig = "E:\нзиф\Работа с объектами2.ini"
$PathExe = "C:\Program Files\з-д им. Фрунзе\СЭТ-4ТМ\Конфигуратор СЭТ-4ТМ 01 04 14.exe"
; =========================================================================================

Run($PathExe)
WinWaitActive("1  СЭТ-4ТМ.01")
Sleep (2000)
send("{ALT}")
send("{RIGHT}")
For $i = 0 to 32
    send("{DOWN}")
 Next
 send("{ENTER}")
Sleep (1000)
ControlCommand("[class:ThunderRT6MDIForm]", "", "msvb_lib_toolbar6", "SendCommandID", 101) ; открыть
WinWaitActive("Открыть")
ControlFocus("Открыть", "", "ID:1148")
Send($PathConfig)
Sleep (1000)
ControlFocus("Открыть", "", "ID:1")
Send("{ENTER}")


При его запуске текст в поле, куда надо писать путь к открываемому файлу, остается пустым, ну и как бы после открытия окна "открыть" вообще больше ничего не происходит. Далее закрываем приложение. При этом иконка autoit в системном лотке остается включенной. Не закрывая эту иконку, запускаем скрипт еще раз, в системном лотке рядом появляется еще одна иконка autoit, и скрипт отрабатывает до конца. И "E:\нзиф\Работа с объектами2.ini" вписывается. и "Enter" эмулируется. Подскажите плз, что в скрипте не так и как правильно переписать код?

Спасибо.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
f9n6001 [?]
как правильно переписать код
Код:
; выбор пункта меню
WinMenuSelectItem("1  СЭТ-4ТМ.01", "", "&Параметры", "&Профиль мощности")
; установка текста
ControlSetText("Открыть", "", "Edit1", $PathExe)
; клик кнопки
ControlClick("Открыть", "", "Button1")
 
Автор
F

f9n6001

Новичок
Сообщения
15
Репутация
0
InnI сказал(а):
WinMenuSelectItem("1 СЭТ-4ТМ.01", "", "&Параметры", "&Профиль мощности")

С этим пока не разбирался, но с ходу тоже не заработало.

ControlSetText("Открыть", "", "Edit1", $PathExe)
ControlClick("Открыть", "", "Button1")

А вот это вроде бы и должно работать... Но ни фига. По документации вроде бы все правильно. Я уже голову сломал...

Код:
;=========================================================================================
Dim $PathConfig, $PathExe
$PathConfig = "E:\нзиф\Работа с объектами2.ini"
$PathExe = "C:\Program Files\з-д им. Фрунзе\СЭТ-4ТМ\Конфигуратор СЭТ-4ТМ 01 04 14.exe"
; =========================================================================================

Run($PathExe)
WinWaitActive("1  СЭТ-4ТМ.01")
Sleep (2000)
send("{ALT}")
send("{RIGHT}")
For $i = 0 to 32
    send("{DOWN}")
 Next
Send("{ENTER}")
Sleep (1000)
ControlCommand("[class:ThunderRT6MDIForm]", "", "msvb_lib_toolbar6", "SendCommandID", 101) ; открыть
;WinWait("Открыть")
; Дальше ничего не работает :(((
; ==================

; установка текста
ControlFocus("Открыть", "", "Edit1")
ControlSetText("Открыть", "", "Edit1", $PathConfig)
;ControlClick("Открыть", "", "Button2")



Хотя, вроде бы чего тут мудреного-то? Я и "Edit1" пробовал писать и "ID:1148". Толку - ноль :( Ниже - информация по контролу.

--- Window Info ---
Title : Открыть
Class : #32770
Position : 0, 0
Size : 563, 416
Client Size : 555, 382
Style : 0x96CC20C4
ExStyle : 0x00010501
Handle : 0x000508AA
PID : 2240

--- Control Info ---
Class : Edit
Instance : 1
ClassnameNN : Edit1
ID : 1148
Text :
Position : 198, 304
Size : 224, 14
ControlClick : 38, 5
Style : 0x54000080
ExStyle : 0x00000000
Handle : 0x000108CC
IsVisible : 1
IsEnabled : 1

--- Mouse Info ---
Position (screen) : 240, 339
Position (window) : 240, 339
Position (client) : 236, 309
Pixel Color (hex) : 0xFFFFFF
Pixel Color (dec) : 16777215
Cursor ID : 5
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
f9n6001 [?]
должно работать
На выполнение команд у AutoIt уходит несколько миллисекунд. AutoIt не ждёт, пока появятся окна и элементы. Вы должны сами об этом позаботиться. Для начала раскомментируйте
Код:
WinWait("Открыть")

Но лучше используйте
Код:
WinWaitActive("Открыть")
 
Автор
F

f9n6001

Новичок
Сообщения
15
Репутация
0
InnI сказал(а):
Но лучше используйте
Код:
WinWaitActive("Открыть")

:blink: У меня такое ощущение, что с ControlCommand() проблема. Часть кода:
Код:
ControlCommand("[class:ThunderRT6MDIForm]", "", "msvb_lib_toolbar6", "SendCommandID", 101) ; открыть
;WinWait("Открыть")
;WinWaitActive("Открыть")
Msgbox(0,"Test","Активизировалось окно")
; установка текста
ControlFocus("Открыть", "", "Edit1")
;Send($PathConfig)
ControlSetText("Открыть", "", "Edit1", $PathConfig)


Если мы выполняем его вместе со строкой WinWait(), то Msgbox() не отрабатвает вообще, а после закрытия приложения, иконка autoit в системном лотке windows не закрывается. А вот если эту строку закомментировать, то Msgbox() отрабатывает, но после закрытия окна "Открыть". То есть получается, что ControlCommand() не возвращает значение до закрытия вызванного им окна что-ли? Вот это как? :stars: :-\

Видео: http://youtu.be/MxxEXXNFuEs

Вот такие пироги :scratch:

P.S: я тут код изменил немного
Код:
$ABC = ControlCommand("[class:ThunderRT6MDIForm]", "", "msvb_lib_toolbar6", "SendCommandID", 101) ; открыть
;WinWait("Открыть")
;WinWaitActive("Открыть")
Msgbox(0,"Test",$ABC)
; установка текста
ControlFocus("Открыть", "", "Edit1")
;Send($PathConfig)
ControlSetText("Открыть", "", "Edit1", $PathConfig)


MsgBox отрабатывает точно так же как и в первом случае. Переменная $ABC содержит 0. Попытка заставить ControlCommand работать в качестве процедуры (чтобы система вообще не ждала возврата значения от функции):
Код:
ControlCommand "[class:ThunderRT6MDIForm]", "", "msvb_lib_toolbar6", "SendCommandID", 101
 ; открыть

закончилась ошибкой компиляции. То есть это строго функция... В бейсике например можно сделать так:
Код:
MsgBox "Text"
и тогда msgbox ничего не возвращает... Здесь не прокатило.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
f9n6001 [?]
с ControlCommand() проблема
Действительно, странное поведение :scratch: Но есть ещё варианты
Код:
; клик по координатам тулбара
ControlClick("[class:ThunderRT6MDIForm]", "", "msvb_lib_toolbar1", "", 1, 40, 12)

; клик по кнопке (у меня индекс кнопки 2, у вас может быть 1)
#include <GuiToolbar.au3>
_GUICtrlToolbar_ClickIndex(ControlGetHandle("[class:ThunderRT6MDIForm]", "", "msvb_lib_toolbar6"), 2)
 
Автор
F

f9n6001

Новичок
Сообщения
15
Репутация
0
InnI сказал(а):
Но есть ещё варианты

Спс :smile: Вот можно еще вас немного помучить?

код:
Код:
WinWaitActive("Открыть")
; установка текста
ControlFocus("Открыть", "", "Edit1")
;Send($PathConfig)
ControlSetText("Открыть", "", "Edit1", $PathConfig)
; клик кнопки
ControlClick("Открыть", "", "Button2")

; ======================================
; До сюда все работает хорошо. Дальше нужна помощь :(

;WinWaitActive("Работа с объектами")
Sleep (10000)
ControlSetText("[class:ThunderRT6MDIForm]", "", "Edit2", "Каждые сутки")
ControlSetText("[class:ThunderRT6MDIForm]", "", "Edit3", "01:00")
ControlClick ("[class:ThunderRT6MDIForm]", "","[CLASS:ThunderRT6CheckBox; INSTANCE:3]")


Итак. После нажатия кнопки "Открыть", программа загружает конфигурационный файл. Это занимает какое-то время. Если узлов в конфиге описано много - то время вполне приличное. При этом открывается форма и находится в таком полуоткрытом состоянии. Картинка1 При этом курсор мыши в "песочные часы" не переходит, так стрелочкой и остается. При этом это окно - не окно никакое, а ClassnameNN : ThunderRT6FormDC1:
--- Window Info ---
Title : 1 СЭТ-4ТМ.01 Версия Конфигуратора от 01.04.14
Class : ThunderRT6MDIForm
Position : -4, -4
Size : 1928, 954
Client Size : 1920, 900
Style : 0x17CF0000
ExStyle : 0x00040100
Handle : 0x001807CC
PID : 3328

--- Control Info ---
Class : ThunderRT6FormDC
Instance : 1
ClassnameNN : ThunderRT6FormDC1
ID : 32771
Text : Работа с объектами
Position : 2, 51
Size : 867, 555
ControlClick : 851, 23
Style : 0x56CA0000
ExStyle : 0x00040140
Handle : 0x001C07A4
IsVisible : 1
IsEnabled : 1

--- Mouse Info ---
Position (screen) : 853, 120
Position (window) : 857, 124
Position (client) : 853, 74
Pixel Color (hex) : 0:rofl:2451E
Pixel Color (dec) : 13780254
Cursor ID : 2

Первый вопрос: можно ли эту штуку обработать по типу WinWaitActive() или поставить побольше Sleep и на том успокоиться?

Дальше идут два ControlSetText(). Проблема в том, что у Edit3 изначально Visible может быть в состоянии "no". Картинка2 (видим режим опроса-ручной, и правее ничего нет. сравните с картинкой4 в самом низу). При этом если в поле "Режим опроса" выбрать значение "Каждые сутки" с помощью мыши, то Edit3 переходит в видимое состояние, а если с помощью ControlSetText(), то второе поле так и не появляется на форме: Картинка3. Хотя, значения в обеих контралах устанавливаются правильные. Мне кажется, что невидимое состояние контрола не должно влиять на работу программы (значение-то контрол все равно содержит правильное), но все-таки хотелось бы как-то перевести его в Visible=ON. Я соответствующую команду не нашел. Должна же быть?

И третий вопрос, самый существенный.

Код:
ControlClick ("[class:ThunderRT6MDIForm]", "","[CLASS:ThunderRT6CheckBox; INSTANCE:3]")

команда не работает. То есть вообще. Как нажать на кнопку, если она и не Button вовсе, а с какого-то перепугу чекбокс? Картинка4

Спасибо.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
f9n6001 [?]
обработать по типу WinWaitActive
У MDI-окон нет понятия активности. Для AutoIt они являются обычными элементами (как кнопки, поля ввода и др.). Появление подобных "окон" можно отследить при помощи текста заголовка или текста вложенного элемента
Код:
; по тексту заголовка
WinWait("[class:ThunderRT6MDIForm]", "Работа с объектами")
; по тексту элемента
WinWait("[class:ThunderRT6MDIForm]", "Опросить выбранные")
А возможность работы с MDI-окном можно отследить по возможности активации какого-либо элемента, например
Код:
; ожидание возможности установить фокус элементу
While Not ControlFocus("[class:ThunderRT6MDIForm]", "Параметры соединения", "Edit2")
  Sleep(30)
WEnd


если с помощью ControlSetText(), то второе поле так и не появляется
Попробуйте работать не с Edit, а с ComboBox
Код:
ControlCommand("[class:ThunderRT6MDIForm]", "Работа с объектами", "ComboBox2", "SelectString", "Каждые сутки")


перевести его в Visible=ON
Если предыдущий совет не поможет, то
Код:
ControlShow("[class:ThunderRT6MDIForm]", "Работа с объектами", "ComboBox3")
но, опять же, не для Edit, а для ComboBox.

команда не работает
Возможно, она не работает потому, что ничего не выбрано? Также можете попробовать
Код:
ControlSend("[class:ThunderRT6MDIForm]", "Параметры соединения", "[CLASS:ThunderRT6CheckBox; INSTANCE:3]", "{space}")
; или
MouseClick() ; координаты зависят от опции MouseCoordMode
 
Автор
F

f9n6001

Новичок
Сообщения
15
Репутация
0
В общем, может оно и не оптимально (не удалось заставить работать WinMenuSelectItem() и пришлось эмулировать клавишные нажатия), но работает. Остался последний штрих - компиляция.
Сам код (хотя он и не сильно нужен в данном случае):
Код:
#include <frunze.cfg>

Run($PathExe)
WinWaitActive("1  СЭТ-4ТМ.01")
Sleep (2000)
send("{ALT}")
send("{RIGHT}")
For $i = 0 to 32
    send("{DOWN}")
 Next
 send("{ENTER}")

; выбор пункта меню
;WinMenuSelectItem("1  СЭТ-4ТМ.01", "", "&Параметры", "&Работа с объектами")
Sleep (1000)
; клик по кнопке
#include <GuiToolbar.au3>
_GUICtrlToolbar_ClickIndex(ControlGetHandle("[class:ThunderRT6MDIForm]", "", "msvb_lib_toolbar6"), 1)
WinWaitActive("Открыть")
; установка текста
ControlFocus("Открыть", "", "Edit1")
;Send($PathConfig)
ControlSetText("Открыть", "", "Edit1", $PathConfig)
; клик кнопки
ControlClick("Открыть", "", "Button2")
Sleep ($SlipTime)
While Not ControlFocus("[class:ThunderRT6MDIForm]", "", "ThunderRT6ComboBox2")
  Sleep(2000)
WEnd

;ControlSetText("[class:ThunderRT6MDIForm]", "", "Edit2", "Каждые сутки")

ControlCommand("[class:ThunderRT6MDIForm]", "", "ThunderRT6ComboBox2", "SelectString", "Каждые сутки")
ControlSetText("[class:ThunderRT6MDIForm]", "", "Edit3", "01:00")
Sleep (1000)
ControlFocus("[class:ThunderRT6MDIForm]", "", "[CLASS:ThunderRT6CheckBox; INSTANCE:3]")
ControlSend("[class:ThunderRT6MDIForm]", "Параметры соединения", "[CLASS:ThunderRT6CheckBox; INSTANCE:3]", "{space}")
;MsgBox(0,"","test")

Принципиальна первая строка: #include <frunze.cfg>
В файл frunze.cfg я вынес объявление переменных с тем, чтобы конечный пользователь сам мог менять местоположение файлов и т.д:
Код:
Dim $PathConfig, $PathExe, $SlipTime
$PathConfig = "E:\нзиф\Работа с объектами2.ini"
$PathExe = "C:\Program Files\з-д им. Фрунзе\СЭТ-4ТМ\Конфигуратор СЭТ-4ТМ 01 04 14.exe"
$SlipTime = 3000


Проблема заключается в том, что при компиляции этот файл тоже компилируется. Хотелось бы этого избежать, чтобы exe'шник при запуске обращался к текстовому файлу и брал от туда значения для переменных (наверное, само объявление переменных есть смысл оставить в главном файле Dim $PathConfig, $PathExe, $SlipTime). Такие хотелки реализуемы?

Спасибо.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
f9n6001 [?]
Такие хотелки реализуемы?
Конечно. Проще всего хранить настройки в ini-файле и работать с этим файлом при помощи функций Ini*(). На форуме много примеров.

не удалось заставить работать WinMenuSelectItem
Обращайте внимание на названия пунктов: после нажатия Alt некоторые буквы подчёркиваются. Если буква подчёркнута, то в названии пункта перед ней нужно добавить &.
 
Автор
F

f9n6001

Новичок
Сообщения
15
Репутация
0
InnI сказал(а):
Конечно. Проще всего хранить настройки в ini-файле и работать с этим файлом при помощи функций Ini*(). На форуме много примеров.

Огромное спасибо за помощь :smile:)
 
Верх