Что нового

Чтение из массива вставка в окно программы

Corse

Новичок
Сообщения
7
Репутация
0
Приветствую!
Прошу помощи разъяснить по фрагменту скрипта:
Код:
Dim $aEmk
_FileReadToArray(@ScriptDir & '\emk.txt'', $aEmk)
    For $i = 1 To $aEmk [3]
    WinWait("ЭМС","")
    If Not WinActive("ЭМС","") Then WinActivate("ЭМС","")
    WinWaitActive("ЭМС","")
    Sleep(500)
    ControlClick('[Class:TmcMain]', '', '[CLASS:TcxCustomInnerTextEdit; INSTANCE:3]', 'main', 1, 132, 29)
    Sleep(500)
    Send ($aEmk [$i]);вставка первого номера из файла - emk.txt
    Sleep(3000)
    Send("{ENTER}")
    Sleep(500)
    Send("{F9}")
    Sleep(1000)
    Send("{F3}")
Next
Sleep(1000)


Автоподстановка номеров из списка который читает массив не идет, кто может объяснить почему?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Лишние кавычки
Код:
_FileReadToArray(@ScriptDir & '\emk.txt', $aEmk)
 
Автор
C

Corse

Новичок
Сообщения
7
Репутация
0
Лишние кавычки
Код:
_FileReadToArray(@ScriptDir & '\emk.txt', $aEmk)
Лишние кавычки
Код:
_FileReadToArray(@ScriptDir & '\emk.txt', $aEmk)
Спасибо, поправил писал торопился. Мне не ясно вот эти моменты:

а)
Код:
[URL='https://autoit-script.ru/docs/keywords/for.htm']For[/URL] $i = 1 [URL='https://autoit-script.ru/docs/keywords/for.htm']To[/URL] $aEmk [3]

Правильно ли тут составлено выражение. По задумке после считывания данных в массив, при проходе первого цикла вводится первая строка с данными из файла emk.txt

б)
Код:
[URL='https://autoit-script.ru/docs/functions/send.htm']Send[/URL] ($aEmk [$i])

В программе ничего не происходит в лучшем случае микает 0 и нажимается клавиша Энтер.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Правильно ли тут составлено выражение
Построчный цикл для этой функции выглядит так
Код:
For $i = 1 To $aEmk[0]


В программе ничего не происходит
Тут сложно что-то советовать. Попробуйте без цикла ввести конкретную строку. Посмотрите содержимое массива. Синхронизируйте раскладки программы и скрипта (желательно чтобы обе были английские). Если программа запускается от имени администратора, то и скрипт нужно запускать с этими правами.

И попробуйте ControlSend. Программа вероятно на Delphi, но иногда это работает.
 
Автор
C

Corse

Новичок
Сообщения
7
Репутация
0
Построчный цикл для этой функции выглядит так
Код:
For $i = 1 To $aEmk[0]



Тут сложно что-то советовать. Попробуйте без цикла ввести конкретную строку. Посмотрите содержимое массива. Синхронизируйте раскладки программы и скрипта (желательно чтобы обе были английские). Если программа запускается от имени администратора, то и скрипт нужно запускать с этими правами.

И попробуйте ControlSend. Программа вероятно на Delphi, но иногда это работает.
Попробую все, через по результатам отпишусь. Спасибо
Сообщение автоматически объединено:

Построчно без цикла работает, в таком виде:
Код:
Sleep(3000)
WinActivate ("ЭМС","")
ControlClick('[Class:TmcMain]', '', '[CLASS:TcxCustomInnerTextEdit; INSTANCE:3]', 'main', 1, 132, 29)
Sleep(500)
Send("7773368");vvod dannix
Sleep(3000)
Send("{ENTER}")
Sleep(500)
ControlClick('', '', '', 'main', 1, 27, 96)
Send("{F9}")
Sleep(1000)
Send("{F3}")
Sleep(1000)


тхт файл проверил, данные в нем есть. Решил посмотреть, что считывается в массив используя пример из хелпа:
Код:
#include <IE.au3>
#include <File.au3>
#include <Array.au3>
#include <WinAPIConv.au3>
 Dim  $aEmk
If Not _FileReadToArray(@ScriptDir & '\emk.tx', $aEmk) Then
    MsgBox(4096, "Ku-- ku", " Ku-- ku epT! = " & @error)
    Exit
EndIf
For $i = 1 To $aEmk[0]
    MsgBox(4096, 'Ku-- ku:' & $i, $aEmk[$i])
Next


В итоге получаю окно с Ку-ку, следовательно данные в массив не считываются?
Программа действительно написана на дельфе
 
Последнее редактирование:

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
Самый простой способ посмотреть что вообще в массиве

Код:
#include <File.au3>
#include <array.au3>
Local $aRecords
_FileReadToArray(@ScriptDir & "\emk.txt", $arecords)

if IsArray($arecords) then
        _ArrayDisplay($arecords)
        for $i = 1 to UBound($arecords) - 1
            MsgBox(0,"",$arecords[$i])
        Next
    Else
        MsgBox(0,"Ошибка","Не является массивом")
EndIf


и у вас выше указано "emk.tx" возможно дело в этом
 
Автор
C

Corse

Новичок
Сообщения
7
Репутация
0
Самый простой способ посмотреть что вообще в массиве

Код:
#include <File.au3>
#include <array.au3>
Local $aRecords
_FileReadToArray(@ScriptDir & "\emk.txt", $arecords)

if IsArray($arecords) then
        _ArrayDisplay($arecords)
        for $i = 1 to UBound($arecords) - 1
            MsgBox(0,"",$arecords[$i])
        Next
    Else
        MsgBox(0,"Ошибка","Не является массивом")
EndIf


и у вас выше указано "emk.tx" возможно дело в этом
добавил t, что в моем случае не считывается, что в вашем. Пишет - Не является массивом
 

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
добавил t, что в моем случае не считывается, что в вашем. Пишет - Не является массивом
значит
1. проверяйте правильный ли у вас путь до файла (или укажите путь напрямую, а не через @ScriptDir)
2. в этом файле есть ли хоть какие либо данные
 
Последнее редактирование:
Автор
C

Corse

Новичок
Сообщения
7
Репутация
0
У вас в MsgBox выводится @error. Посмотрите в справке, что эта ошибка означает.
Нет @error не выводится, не считываются данные в массив просто
Сообщение автоматически объединено:

значит
1. проверяйте правильный ли у вас путь до файла (или укажите путь напрямую, а не через @ScriptDir)
2. в этом файле есть ли хоть какие либо данные
1. Так и так проверил, эффекта нет
2. Данные есть, несколько строк с цифровыми значениями.

Может я не тот инструмент использую для решения своей задачи? Или не ту версию программы, сейчас установлена - 3.3.16.1
 
Автор
C

Corse

Новичок
Сообщения
7
Репутация
0
значит
1. проверяйте правильный ли у вас путь до файла (или укажите путь напрямую, а не через @ScriptDir)
2. в этом файле есть ли хоть какие либо данные
а Вы могли бы создать файл тхт с таким же названием как у меня, вписать в него вот такие значения построчно (в одной строке одна комбинация цифр -
703489
222111
333227
3336617
7678952
7975481
)

и использовать ваш скрипт
Код:
#include <File.au3>
#include <array.au3>
Local $aRecords
_FileReadToArray(@ScriptDir & "\emk.txt", $arecords)

if IsArray($arecords) then
        _ArrayDisplay($arecords)
        for $i = 1 to UBound($arecords) - 1
            MsgBox(0,"",$arecords[$i])
        Next
    Else
        MsgBox(0,"Ошибка","Не является массивом")
EndIf

Что бы я мог исключить какой то глюк у себя, если у вас это заработает и не выйдет сообщение - Не является массивом
Сообщение автоматически объединено:

Если вы видите сообщение "Ku-- ku", то после "=" должен быть код ошибки. Например, при отсутствии файла будет 1.

Приложите файл emk.txt или его часть.
Действительно!!! выводится 1, не понимаю как так то, файл есть данные в нем есть, файл даю
Сообщение автоматически объединено:

Если вы видите сообщение "Ku-- ku", то после "=" должен быть код ошибки. Например, при отсутствии файла будет 1.

Приложите файл emk.txt или его часть.
Разобрался данные выводит, файл назывался - '\emk.txt.txt' , это капец))))
Сообщение автоматически объединено:

Скрипт приобрел следующий вид
Код:
#include <IE.au3>
#include <File.au3>
#include <Array.au3>
#include <WinAPIConv.au3>

Sleep(1000)

 Dim  $aEmk
 _FileReadToArray(@ScriptDir & '\emk.txt.txt', $aEmk) 
For $i = 1 To $aEmk[0]
    ControlClick('[Class:TmcMain]', '', '[CLASS:TcxCustomInnerTextEdit; INSTANCE:3]', 'main', 1, 132, 29)    
    Sleep(500)
    Send ($aemk [$i])
    Sleep(1000)
    Send("{ENTER}")
    Sleep(1000)    
    ControlClick('[Class:TmcMain]', '', '[CLASS:TcxGridSite; INSTANCE:2]')  
    Sleep(2000)
    Send("{SPACE}")  
    Sleep(1000)
    Send("{F3}") 
    Sleep(2000)
    ;Send("{ESC}"); potom zamenit na f9
    Sleep(500)
Next

 Dim  $aNom
 _FileReadToArray(@ScriptDir & '\nom.txt', $aNom) 
 For $i = 1 To $aNom[0]
    ControlClick('[Class:TmcExamResultsReg]', '', '[CLASS:TcxDBTreeList; INSTANCE:1]', 'main', 1, 550, 90)    
    Sleep(500)
    Send ($aNom [$i])
    Sleep(500)
    Send("{DOWN}") 
    Sleep(500)
Next

Dim  $aData
_FileReadToArray(@ScriptDir & '\data.txt', $aData) 
For $i = 1 To $aData[0]
    Sleep(500)
    Send ($aData [$i])
        Sleep(500)
    Send("{DOWN}") 
    Sleep(500)
Next


Только вместо одного ввода данных, он вначале прокручивает все вписанные данные в тхт файл, и не переходит по цепочке. Есть 3 текстовых файла с информацией, из emk.txt.txt, должна браться первая строка с номером, он вводится в поле, и осуществляется переход внутри программы. Открывается новое окно, берется первая строка из nom.txt ($aNom) и вводится поле, осуществляется навигация вниз и в другое поле вставляется информация из data.txt ($aData). Как подкорректировать скрипт, что бы он прогонял не весь текстовый файл, а по очереди строчку за строчкой синхронизировано с данными из других текстовых файлов?
 

Вложения

  • emk.txt.txt
    52 байт · Просмотры: 1
Последнее редактирование:

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
Не совсем понимаю зачем вам тогда делать три цикла, если у вас и так идет все по порядку, да и думаю количество строк будет совпадать и цикл в целом не сломается. Просто получаете только по первому файлу количество строк да и все
Код:
#include <File.au3>

Dim $aEmk, $aNom, $aData

_FileReadToArray(@ScriptDir & '\emk.txt.txt', $aEmk)
_FileReadToArray(@ScriptDir & '\nom.txt', $aNom)
_FileReadToArray(@ScriptDir & '\data.txt', $aData)

if $aEmk[0] = $aNom[0] and $aEmk[0] = $aData[0] then
    For $i = 1 To $aEmk[0]
        ControlClick('[Class:TmcMain]', '', '[CLASS:TcxCustomInnerTextEdit; INSTANCE:3]', 'main', 1, 132, 29)
        Sleep(500)
        Send ($aemk [$i])
        Sleep(1000)
        Send("{ENTER}")
        Sleep(1000)
        ControlClick('[Class:TmcMain]', '', '[CLASS:TcxGridSite; INSTANCE:2]')
        Sleep(2000)
        Send("{SPACE}")
        Sleep(1000)
        Send("{F3}")
        Sleep(2000)
        ;Send("{ESC}"); potom zamenit na f9
        Sleep(500)
        ControlClick('[Class:TmcExamResultsReg]', '', '[CLASS:TcxDBTreeList; INSTANCE:1]', 'main', 1, 550, 90)
        Sleep(500)
        Send ($aNom [$i])
        Sleep(500)
        Send("{DOWN}")
        Sleep(500)
        Sleep(500)
        Send ($aData [$i])
        Sleep(500)
        Send("{DOWN}")
        Sleep(500)
    Next
Else
    MsgBox(0,"ошибка", "колчество строк не совпадает")
EndIf
 
Последнее редактирование:
Автор
C

Corse

Новичок
Сообщения
7
Репутация
0
Выдает ошибку - количество строк не совпадает. В трех текстовых файлах прописано по одной строке
Сообщение автоматически объединено:

Не совсем понимаю зачем вам тогда делать три цикла, если у вас и так идет все по порядку, да и думаю количество строк будет совпадать и цикл в целом не сломается. Просто получаете только по первому файлу количество строк да и все
Код:
#include <File.au3>

Dim $aEmk, $aNom, $aData

_FileReadToArray(@ScriptDir & '\emk.txt.txt', $aEmk)
_FileReadToArray(@ScriptDir & '\nom.txt', $aNom)
_FileReadToArray(@ScriptDir & '\data.txt', $aData)

if $aEmk[0] = $aNom[0] and $aEmk[0] = $aData[0] then
    For $i = 1 To $aEmk[0]
        ControlClick('[Class:TmcMain]', '', '[CLASS:TcxCustomInnerTextEdit; INSTANCE:3]', 'main', 1, 132, 29)
        Sleep(500)
        Send ($aemk [$i])
        Sleep(1000)
        Send("{ENTER}")
        Sleep(1000)
        ControlClick('[Class:TmcMain]', '', '[CLASS:TcxGridSite; INSTANCE:2]')
        Sleep(2000)
        Send("{SPACE}")
        Sleep(1000)
        Send("{F3}")
        Sleep(2000)
        ;Send("{ESC}"); potom zamenit na f9
        Sleep(500)
        ControlClick('[Class:TmcExamResultsReg]', '', '[CLASS:TcxDBTreeList; INSTANCE:1]', 'main', 1, 550, 90)
        Sleep(500)
        Send ($aNom [$i])
        Sleep(500)
        Send("{DOWN}")
        Sleep(500)
        Sleep(500)
        Send ($aData [$i])
        Sleep(500)
        Send("{DOWN}")
        Sleep(500)
    Next
Else
    MsgBox(0,"ошибка", "колчество строк не совпадает")
EndIf
Потер лишние строки в текстовом файле, ошибка пропала (количество строк не совпадает)
 
Последнее редактирование:
Верх