Что нового

Массивы Ошибка массива

Пост номер 12 был отмечен как лучший ответ.

juder

Новичок
Сообщения
13
Репутация
0
Всем привет!
Написал тут скриптец, по работе припекло, т.к. я не программер вовсе, состряпал костыль, но вот ошибка выпадает.
Кратко: Заполняет некую табличку в некоей программе. Перед этим запрашивает у пользователя данные сколько групп заполнить, и по сколько цветов в каждой группе прописать.
AutoIt код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <ButtonConstants.au3>
#include <Array.au3>
Global $aColor[25]
Global $text
Global $i
Global $ch1
$aColor[1] = "Красный"
$aColor[2] = "Голубой"
$aColor[3] = "Зеленый"
$aColor[4] = "Желтый"
$aColor[5] = "Фиолетовый"
$aColor[6] = "Белый"
$aColor[7] = "Оранжевый"
$aColor[8] = "Серый"
$aColor[9] = "Коричневый"
$aColor[10] = "Св.Зеленый"
$aColor[11] = "Бирюзовый"
$aColor[12] = "Розовый"
$aColor[13] = "Красный \"
$aColor[14] = "Голубой \"
$aColor[15] = "Зеленый \"
$aColor[16] = "Желтый  \"
$aColor[17] = "Фиолетовый \"
$aColor[18] = "Белый \"
$aColor[19] = "Оранжевый \"
$aColor[20] = "Серый \"
$aColor[21] = "Коричневый \"
$aColor[22] = "Св.Зеленый \"
$aColor[23] = "Бирюзовый \"
$aColor[24] = "Розовый \"

$hGUI = GUICreate("Расцветка ОВ", 300, 200)

GUICtrlCreateLabel("Сколько делать:", 10, 23)
$iCount = GUICtrlCreateInput("", 130, 20, 160, 20)

GUICtrlCreateLabel("В каждом по порядку:", 10, 53)
$iCount1 = GUICtrlCreateInput("", 130, 50, 160, 20)
$nCh1 = GUICtrlCreateCheckbox("Сохранить после выполнения?", 10, 83, 190, 80)
$iOK_Button = GUICtrlCreateButton("OK", 20, 170, 80, 20)

GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iOK_Button
            $count = GUICtrlRead($iCount)
            $count1 = GUICtrlRead($iCount1)
            $ch1 = GUICtrlRead($nCh1)
            ExitLoop
    EndSwitch
WEnd

$aCount = StringSplit($count1, ".")
;_ArrayDisplay($aCount, 'x')

$hWnd = WinGetHandle("[CLASS:TOpticalConnectorLoadListView]")
If Not $hWnd Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf
WinActivate($hWnd)


For $p=1 to $count
For $r = 1 To Ubound($aCount)
For $i=1 to $aCount[$r]
    
$text=$aColor[$i]   

ControlFocus($hWnd, "", "[ACTVE]")
ControlClick($hWnd,'','[CLASS:TdxInplaceTreeListMaskEdit; INSTANCE:1]', "right", 1)
Ex1()
Next
Next
Next

If $ch1 = 1 Then
    Send("^s")
    MsgBox('','','Complite SAVE!!!')
    Exit
Else
    MsgBox('','','Complite \n NOT SAVE!!!')
    Exit
EndIf
Func Ex1()
Sleep(500)
Send('{RIGHT}')
Sleep(500)
Send('{DOWN 6}')
Sleep(500)
Send('{ENTER}')
Sleep(1000)
$hWnd1 = WinGetHandle("[CLASS:TAInputQueryForm]")
ControlClick($hWnd1,'', '[CLASS:TADBEdit; INSTANCE:1]', "main", 1)
ControlSend($hWnd1, "", "[CLASS:TADBEdit; INSTANCE:1]", $text)
ControlClick($hWnd1,'', '[CLASS:TAButton; INSTANCE:2]', "main", 1)
Sleep(500)
Send('{DOWN}')
Sleep(1000)
EndFunc
В общем-то заполняет нормально, но после заполнения выдает ошибку и не дорабатывает до конца:
Error.png
Как это можно победить подскажите плиз?
 

InnI

AutoIT Гуру
Сообщения
4 402
Репутация
1 191
Код:
For $r = 1 To UBound($aCount) - 1
; или так
For $r = 1 To $aCount[0]
 
Автор
J

juder

Новичок
Сообщения
13
Репутация
0
Код:
For $r = 1 To UBound($aCount) - 1
; или так
For $r = 1 To $aCount[0]
В том и проблема, не работает корректно (
При таких вариантах берет 0й элемент массива (который общее кол-во эл-тов в массиве) я так понимаю, и допустим если пользователь ввел заполнить 2 группы в 1ой один цвет и во второй 2 цвета, он заполняет 3цвета, а потом еще раз 3 цвета, т.е я так понимаю на 1 итерацию больше делает. Без -1 заполняет нормально, но выпадает с ошибкой которая выше в конце цикла.
Сумбурно но вот скрин для примера выше:
Безымянный.png
А должно быть заполнено:
Красный
Красный
Голубой
Помогите люди плиз:flag: горю по срокам с заполнением, ппц какой объем:very-scare:
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4 402
Репутация
1 191
Покажите конкретные данные, которыми вы заполняете поля ввода.
 
Автор
J

juder

Новичок
Сообщения
13
Репутация
0
Покажите конкретные данные, которыми вы заполняете поля ввода.
В коде в 1м сообщении массив $aColor. Если я правильно вопрос понял
Для примера ввод условия и корректно заполненная таблица
Безымянный.pngБезымянный1.png
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4 402
Репутация
1 191
При запуске скрипта появляется окно с полями ввода. Какие данные вы вводите в эти поля, чтобы увидеть результат "красный красный голубой"?
 
Автор
J

juder

Новичок
Сообщения
13
Репутация
0
При запуске скрипта появляется окно с полями ввода. Какие данные вы вводите в эти поля, чтобы увидеть результат "красный красный голубой"?
Дополнил скринами пред. свое сообщение
 

InnI

AutoIT Гуру
Сообщения
4 402
Репутация
1 191
"В каждом по порядку" понятно: прочитать первые N элементов массива.

Что значит "Сколько делать"? Нужно сделать указанное число таблиц? Т.е. четыре раза по "4.4.4.4"?
Или это число должно соответствовать количеству элементов, разделённых точкой? Если так, то зачем его отдельно указывать и что делать, если не совпадает?
 
Автор
J

juder

Новичок
Сообщения
13
Репутация
0
В общем задача такая, есть таблицы с количеством строк 8,16,32. Нужно заполнить таблицу в соответствии с подключением кабеля с цветными волокнами к "таблице". Количество подключенных кабелей к таблице - рандом (от 1 до 10 допустим) - это "сколько делать". В каждом кабеле рандом количество подключенных волокон(массив $aColor) - это "в каждом по порядку". Т.е. в первом поле допустим 4 кабеля. Во втором поле: 4.4.4.4 - 4 цвета в 1 кабеле, 4 во втором, 4 в третьем 4 в четвертом итого 16строчная таблица заполнена. Всякие варианты есть заполнения допустим 6 / 6.6.4.4.6.6 - для 32х таблицы итд рандомно в общем.
 

InnI

AutoIT Гуру
Сообщения
4 402
Репутация
1 191
Если я правильно понял, то в поле "в каждом по порядку" запись "4" означает 1 кабель, запись "2.5.8" означает 3 кабеля, запись "15.15.1.10.10" означает 5 кабелей. Правильно? Если да, то для чего поле "сколько делать"? Если нет, то я чего-то не понимаю...
 
Автор
J

juder

Новичок
Сообщения
13
Репутация
0
Если я правильно понял, то в поле "в каждом по порядку" запись "4" означает 1 кабель, запись "2.5.8" означает 3 кабеля, запись "15.15.1.10.10" означает 5 кабелей. Правильно? Если да, то для чего поле "сколько делать"? Если нет, то я чего-то не понимаю...
Вот скрин как оно работает, но в конце плюет ошибкой. Заполняется по порядку ... Блин 4 синюю стрелку не туда нарисовал ) она должна указывать на блок 4.
Безымянный3.png
 

InnI

AutoIT Гуру
Сообщения
4 402
Репутация
1 191
Хорошо. Спрошу по другому. Зачем указывать "Сколько делать", если это известно по количеству элементов "В каждом по порядку"? Число в $aCount[0] и есть количество "Сколько делать". И что делать, если на вашем скриншоте изменить "Сколько делать" на 8 или на 3?

Пробуйте
Код:
$i = 1
For $p = 1 To $count
  For $r = 1 To $aCount[$i]
    
    $text = $aColor[$r]

    ControlFocus($hWnd, "", "[ACTVE]")
    ControlClick($hWnd, '', '[CLASS:TdxInplaceTreeListMaskEdit; INSTANCE:1]', "right", 1)
    Ex1()
  Next
  $i += 1
  If $i > $aCount[0] Then ExitLoop
Next
 
Автор
J

juder

Новичок
Сообщения
13
Репутация
0
И что делать, если на вашем скриншоте изменить "Сколько делать" на 8 или на 3?
Сколько делать:8 В каждом:4.4.4.4.4.4.4.4(32) либо 5.3.4.4.4.3.4.5(32) либо 1.1.1.1.1.1.1.25(32)....... - всякий другой рандом
Сколько делать:3 В каждом:30.1.1(32) либо 5.6.21(32) либо 4.16.12(32)......... - всякий другой рандом
Во! :good: То что доктор прописал!!! С Вашим кодом все работает как надо! Большое человеческое Спасибо!!!
А я чего-то с циклами перемудрил видимо!
 

InnI

AutoIT Гуру
Сообщения
4 402
Репутация
1 191
А если я такими данными заполню

Сколько делать:8
В каждом:5.6.21

Скрипт правильно отработает?
 
Автор
J

juder

Новичок
Сообщения
13
Репутация
0
А если я такими данными заполню

Сколько делать:8
В каждом:5.6.21

Скрипт правильно отработает?
нет, (В каждом) должно быть 8 цифр через точку (т.е. 8 групп) в каждой группе указанное количество цветов
Сообщение автоматически объединено:

Блин сейчас дошло, что вроде как нужды в (Сколько делать) и нету вроде можно было взять из массива данные о кол-ве позиций... Но переделывать сейчас уж некогда в принципе, теперь скрипт работает корректно!
 

InnI

AutoIT Гуру
Сообщения
4 402
Репутация
1 191
(В каждом) должно быть 8 цифр через точку (т.е. 8 групп) в каждой группе указанное количество цветов
Так я об этом и говорю. Количество групп и есть количество кабелей. Поле "сколько делать" - лишнее. Поэтому вы и запутались.
Сообщение автоматически объединено:

переделывать сейчас уж некогда
Тогда хотя бы проверку добавьте
Код:
$aCount = StringSplit($count1, ".")
If $aCount[0] <> $count Then Exit MsgBox(4096, 'Сообщение', 'Некорректный ввод данных')
 
Последнее редактирование:
Автор
J

juder

Новичок
Сообщения
13
Репутация
0
Так я об этом и говорю. Количество групп и есть количество кабелей. Поле "сколько делать" - лишнее. Поэтому вы и запутались.

Тогда хотя бы проверку добавьте
Ну говорю ж не программист ) Надергал куски подходящих сниппетов с форума и со справки, слепил в кучу костыль, до чего где не допетрил, вот и пришлось на форум обратиться! Хорошо что тут люди помогают !
Зато теперь тыща тыщь таблиц руками не заполнять красота )
Насчет проверки хорошая идея, ошибался несколько раз при вводе, завтра добавлю сегодня домой уже хватит работать )
Еще раз спасибо!
 
Верх