1 (изменено: Nerv0z, 2020-06-28 00:32:03)

Тема: AHK: Несколько значений в переменной

Добрый день.
Подскажите, как правильно написать, подстановку следующих значений из переменных Items и Price в моих циклах.
Вот, что я смог написать сам:


i := 1
Items := "1","2","3","4","5"...
Price := "46500","19350","33000","26800","145500"

F1::
Block0:
; Клик на строку ввода
MouseClick, left,  70,  120 ;
Sleep, 200 
; Вводим требуемый предмет
Send, %Items%
Sleep, 100 
; Клик 
MouseClick, left,  60,  160 ;
Sleep, 100 
; Клик 
MouseClick, left,  480,  80 ;
Sleep, 100 
; Клик в строку цены
MouseClick, left,  920,  180 ;
Sleep, 100 
; Вводим стоимость
Send, %Price%
Sleep, 100 
; Клик на ОК
MouseClick, left,  730,  460 ;
Sleep, 100 
goto, Block1
Return

Block1:
if (i < 21) {
goto Block2
}
else {
goto Block3
}

Block2:
;клик по действию
MouseClick, left,  1766,  180 ;
Sleep, 200 
i++

ToolTip, %i% %Items1%-%Price1%
goto, Block1
Return

Block3: 
MouseClick, left,  1100,  1060 ;
Sleep, 500

; Зажимаем Ctrl
Send, {Ctrl Down}
; Клик действия
Send {Click 1860, 960};
Sleep, 300

; Отпускаем Ctrl
Send, {Ctrl Up}
Sleep, 300

; клик дейсвтия
MouseClick, left,  960,  166 ;
Sleep, 500

i := 0
goto, Block0
Return

; Выход по F4.
F4::
ExitApp
Return

Циклы работают, корректно, но вот не знаю, как сделать, чтобы значение переменной (Items, Price ) каждый раз подставлялось следующее.
Буду очень признателен, за помощь.

2

Re: AHK: Несколько значений в переменной

В справке посмотрите "массивы" и "объекты".

3

Re: AHK: Несколько значений в переменной

Справку читал, но не понял как применить.. можете привести пример как в моём случае..
Спасибо.

4

Re: AHK: Несколько значений в переменной

/*
Items := "1","2","3","4","5"...
Price := "46500","19350","33000","26800","145500"
*/

Array := {1: 46500, 2: 19350, 3: 33000, 4: 26800, 5: 145500}

x := 3

MsgBox, % Array[x]

5 (изменено: Nerv0z, 2020-06-28 00:31:46)

Re: AHK: Несколько значений в переменной

ypppu
А как мне обратится к каждому из значений в массиве ?
То есть, мне в цикле нужно ввести %Предмет% и %Цена%

В массиве это будет Array := {1: 46500,}

Как мне получить это значение в следующем блоке ?

вот таким запросом :


; Вводим требуемый предмет
Send, %Items%
Sleep, 100 

??

6 (изменено: __Михаил__, 2020-06-27 23:39:06)

Re: AHK: Несколько значений в переменной

Nerv0z

Вроде пример годный. Что ещё можно добавить?

Может так понятнее будет:

F2::
Array := {1: 46500, 2: 19350, 3: 33000, 4: 26800, 5: 145500}
maxL := Array.Length()

loop, % maxL
{
 i += 1
 ToolTip, % Array[i]
 Sleep, 1000
}
ToolTip
Return

Другими словами: Создайте свой словарь, и когда нужно используйте из него нужный индекс:

Send, % Array[i]

Затем прибавляем к переменной 'i' значение, что бы далее была вставка следующей строки:

i += 1
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

7

Re: AHK: Несколько значений в переменной

Спасибо, кажется понял, сейчас попробую это написать в коде.

8 (изменено: qqlexa, 2020-06-27 23:58:38)

Re: AHK: Несколько значений в переменной

__Михаил__, у вас же не определён индекс і, ну и, имхо, если использовать индекс только в цикле,  лучше использовать A_Index, о переменных можно почитать тут

9 (изменено: Nerv0z, 2020-06-28 00:47:58)

Re: AHK: Несколько значений в переменной

Подскажите, еще совет, вот как я всё оформил :


;FileEncoding, UTF-8

i := 1

ArrayItems := {1: "яблоко",2: "банан",3: "апельсин",4: "ананас",5: ",папая"}
ArrayPrice := {1: 46500,2: 19350,3: 33000,4: 26800,5: 145500}

F1::
Block0:
; Клик на строку ввода
MouseClick, left,  70,  120 ;
Sleep, 500

; Вводим требуемый предмет
Send, % ArrayItems"i"
Sleep, 500

; Клик по 
MouseClick, left,  480,  80 ;
Sleep, 500

; Клик в строку 
MouseClick, left,  920,  180 ;
Sleep, 500

; Вводим сумму 
Send, % ArrayPrice:"i"
Sleep, 500 

; Клик на ОК
MouseClick, left,  730,  460 ;
Sleep, 1000 

; Клик на Строке предмета
MouseClick, left,  145,  165 ;
Sleep, 500 

i++
goto Block0
Return

F4::
ExitApp
Return

Скрипт отрабатывает идеально, но !!!
Вопрос в кодировке, у меня вместо значений из массива Предметов, выводятся знаки "????????"
как это побороть ?

10 (изменено: qqlexa, 2020-06-28 00:17:18)

Re: AHK: Несколько значений в переменной

Nerv0z, оформление кода только в теге code
Вместо Block0 и goto Block0 используйте бесконечный цикл loop{}
Язык по умолчанию

11

Re: AHK: Несколько значений в переменной

qqlexa
Оформил код согласно замечаниям..
нет, loop мне не подходит, потому что у меня переходы между блоками происходят..
Да и проблема осталась не в этом..
Кодировка или что то теряется, при чтении массива..

12

Re: AHK: Несколько значений в переменной

qqlexa

1) Кодирую не первый день, АХК создаёт переменную, если её не объявили. Таким образом её можно не указывать.

2) Для теста да, не нужно использовать переменную 'i', но ведь когда Nerv0z будет использовать вставку из словаря, ему будет не нужна переменная из цикла, ведь цикла не будет, верно? Поэтому я и ввёл переменную в код.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

13

Re: AHK: Несколько значений в переменной

__Михаил__
А по моему вопросу не подскажите, Михаил  ? в чем может быть проблема с вопросиками..

14 (изменено: __Михаил__, 2020-06-28 01:20:19)

Re: AHK: Несколько значений в переменной

Nerv0z

Тоже сталкиваясь с такой проблемой, я обычно пересоздавал файл и копировал в него участки кода. Глупо, зато эффективно. Не искал способов решить иначе.

По вашему последнему коду, могу посоветовать вместо команды эмуляции ввода из переменной, сделать вставку через буфер. Так будет гораздо быстрее.

F2::
ArrayItems := {1: "яблоко",2: "банан",3: "апельсин",4: "ананас",5: "папая"}
i ++

R := Clipboard	; Сохранить текущий буфер.
Clipboard = % ArrayItems[i] ; Заменить буфер.
Send ^{vk56}	; Ctrl + V Вставить текст из буфера.
Clipboard = % R ; Вернуть буфер
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

15

Re: AHK: Несколько значений в переменной

Понял, сейчас попрбобую..

16

Re: AHK: Несколько значений в переменной

__Михаил__ пишет:

Nerv0z


Clipboard = % ArrayItems[i] ; Заменить буфер.
Clipboard = % R ; Вернуть буфер

Почему бы не использовать ":="?

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

17

Re: AHK: Несколько значений в переменной

Nerv0z пишет:

ArrayItems := {1: "яблоко",2: "банан",3: "апельсин",4: "ананас",5: ",папая"}
ArrayPrice := {1: 46500,2: 19350,3: 33000,4: 26800,5: 145500}

Тут наверное лучше использовать многомерный (вроде это так называлось) объект.


arrayItems := [{name: "яблоко", price: 46500} ; 1
			  ,{name: "банан", price: 19350} ; 2
			  ,{name: "апельсин", price: 33000} ; 3
			  ,{name: "ананас", price: 26800} ; 4
			  ,{name: "папая", price: 145500}] ; 5 ....

msgbox, % "Name: " arrayItems[2].name "`nPrice: " arrayItems[2].price
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

18 (изменено: __Михаил__, 2020-06-28 05:32:54)

Re: AHK: Несколько значений в переменной

Phoenixxx_Czar

1) А есть разница? Присваивание переменной значения особо не играет роли, лишь бы синтаксис был верным и выполнял задуманной цели.
Или я чего не понимаю в вашем вопросе?

2) Многоуровневые массивы / списки массивов и прочее в данном варианте лишний раз запутают. Куда проще видеть ключ:значение. Где ключ равен цифре и соответственно индексу в массиве.

В любом случае, каждый сам решает как программировать конкретно ему и в данный момент. Иногда через месяц другой можно научиться многим тонкостям и пойти править старый 'быдлокод' в 'элитный'.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

19

Re: AHK: Несколько значений в переменной

__Михаил__ пишет:

А есть разница?

Если пишете скрипт для себя, тогда как нравится, если выкладываете на форум — лучше придерживаться общепринятого синтаксиса.

__Михаил__ пишет:

Где ключ равен цифре и соответственно индексу в массиве

Тут, конечно, дело предпочтения, но глядя через какое-то время на безликие индексы в массиве, гораздо труднее будет понять, что происходит в скрипте, и по какому индексу что находится.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder