1 (изменено: serzh82saratov, 2012-08-09 16:33:49)

Тема: AHK: Сравнение переменной со списком, и назначение новой.

Господа будьте добры, объясните новичку как не писать сто этажные IF = { } Else, как переменную сравнить со списком, и исходя из этого назначить новую.

Var = Ложка
List := "Стакан=Стеклянный"|"Вилка=Железная"|"Ложка=Деревянная"
MsgBox Ложка %List%
Else
MsgBox Переменной нет в списке
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Сравнение переменной со списком, и назначение новой.

Не уверен, правильно ли я понял задачу.

Var = Ложка
List := {"Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"}
if List.HasKey(Var)
    MsgBox, % List[Var]
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: serzh82saratov, 2012-08-09 17:26:55)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Благодарю! То что надо!
Где же про такое в справке прочитать...

Не могу хотя бы понять чем "% List[Var]" отличается от "%List[Var]%"

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4 (изменено: creature.ws, 2012-08-09 17:30:00)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Вероятно, тем, что при использовании %List[Var]% скрипт не выполнится.

Про встроенные методы объектов AHK_L можно почитать здесь.

5

Re: AHK: Сравнение переменной со списком, и назначение новой.

serzh82saratov пишет:

Где же про такое в справке прочитать...

Здесь и здесь.

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

6 (изменено: serzh82saratov, 2012-08-09 17:32:34)

Re: AHK: Сравнение переменной со списком, и назначение новой.

creature.ws пишет:

Вероятно, тем, что при использовании %List[Var]% скрипт не выполнится.

Я понимаю, точнее не  понимаю а проверил. Я про то что в справке, вроде бы все переменные заключаются внутри %%, а тут один % и пробел вроде.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7 (изменено: creature.ws, 2012-08-09 17:41:39)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Неужто пришло время дать вам эту ссылку

List[var] это как Function(param), не переменная, а выражение возвращающее некое значение.

8 (изменено: serzh82saratov, 2012-08-09 17:44:35)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Спасибо за ссылки, с инглишем туго. А без него конечно тяжело в таком деле. Промт тут непоможет. Буду понемногу пытатся что-то понять.

З.Ы. Даа, надо учить инглиш. Хотя частенько и на русском описания AutoHotkey не доходят. Програмирование как ни крути, для умных людей,
а не для таких дилетантов как я.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: serzh82saratov, 2012-08-09 18:00:56)

Re: AHK: Сравнение переменной со списком, и назначение новой.

List[var] это как Function(param), не переменная, а выражение возвращающее некое значение.

Потихоньку начинаю понимать, а на русском про это есть что нибудь? кроме http://www.script-coding.com/AutoHotkey/Functions.html

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10 (изменено: creature.ws, 2012-08-09 18:13:31)

Re: AHK: Сравнение переменной со списком, и назначение новой.

OFF: А буква "Д" в коде выше только у меня не отображается?
http://ompldr.org/vZjFtNA/Capture.PNG

11

Re: AHK: Сравнение переменной со списком, и назначение новой.

буква "Д
у меня видно

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12 (изменено: serzh82saratov, 2012-08-09 22:55:37)

Re: AHK: Сравнение переменной со списком, и назначение новой.

а можно ли в этом варианте использовать переменные

Var = Documents
List := {"Documents": "%A_MyDocuments%", "Script": "%A_ScriptDir%"}
if List.HasKey(Var)
Run % List[Var]

и так

Var = Documents
List := {"Documents": "%A_MyDocuments%", "Script": "%A_ScriptDir%"}
if List.HasKey(Var)
Var2 = % List[Var]
Run %Var2%

ругается

Error:  Failed attempt to launch program or document:
Action: <%A_MyDocuments%>
Params: <>
Specifically: Не удается найти указанный файл.
--->    011: Run,%Var2%

Но ведь в переменной %Var2% содержится  %A_MyDocuments%, да и в MsgBox  % List[Var] тоже. Ведь просто Run %A_MyDocuments% открывает папку. и так тоже

Var2 = %A_MyDocuments%
Run %Var2%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13 (изменено: creature.ws, 2012-08-09 23:00:28)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Var := "Documents"
List := {Documents: A_MyDocuments, Script: A_ScriptDir}
if List.HasKey(Var)
    Var2 := List[Var]
Run %Var2%

Лучше для присваивания повсеместно использовать :=, а = лишь для сравнения.

14

Re: AHK: Сравнение переменной со списком, и назначение новой.

СПАСИБО ВАМ.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Сравнение переменной со списком, и назначение новой.

Здесь нужно заметить, что если для названия ключей используется кириллица, они обязательно должны быть в кавычках, иначе выдаст ошибку:

Var := "Документы"
List := {"Документы": A_MyDocuments, Script: A_ScriptDir}
if List.HasKey(Var)
    Var2 := List[Var]
Run %Var2%
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Сравнение переменной со списком, и назначение новой.

Здесь нужно заметить, что если для названия ключей используется кириллица, они обязательно должны быть в кавычках, иначе выдаст ошибку:

Только в случае с переменными?
Ведь так

Var = "Ложка"
List := {"Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"}
if List.HasKey(Var)
    MsgBox, % List[Var]
Else
MsgBox нет

будет не правильно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: creature.ws, 2012-08-09 23:24:43)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Поле «имя ключа» подразумевает текст, «значение» — выражение.

variable := 123
keyName := "key2"
var := "value"
value := 345
Obj := {key1:variable, (keyName):234, key3:%var%}

MsgBox % obj.key1 "`n" obj.key2 "`n" obj.key3

Только в случае с переменными?

:= подразумевает,  что  справа выражение, = для присваивания подразумевает текст.

Var := "Ложка"
List := {"Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"}
if List.HasKey(Var)
    MsgBox, % List[Var]
Else
MsgBox нет

18

Re: AHK: Сравнение переменной со списком, и назначение новой.

Вроде дошло, только про := мне сказали, а я снова за своё

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Сравнение переменной со списком, и назначение новой.

Вроде понял как и то и другое использовать

Var := "Ложка"
List := {"Документы": A_MyDocuments, "Ложка": "Деревянная"}
if List.HasKey(Var) {
Var2 := List[Var]
    MsgBox, %Var2% 
} Else MsgBox нет
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

Re: AHK: Сравнение переменной со списком, и назначение новой.

Да ещё читал в справке

Строка, начинающаяся с AND/OR/&&/|| (или с другого оператора), становится продолжением предшествующей строки.

Var := "Ложка"
List := {"Документы": A_MyDocuments,
AND "Ложка": "Деревянная"}
if List.HasKey(Var) {
Var2 := List[Var]
    MsgBox, %Var2% 
} Else MsgBox нет

как же мне перенести на другую строку часть списка?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Сравнение переменной со списком, и назначение новой.

And не нужно, запятую перенеси на новую строку.

22

Re: AHK: Сравнение переменной со списком, и назначение новой.

Irbis пишет:

And не нужно, запятую перенеси на новую строку.

Спасибо.
100 вариантов перебрал, а этот не попробовал

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: Сравнение переменной со списком, и назначение новой.

А возможно ли вместо списка использовать переменную?

KeyCodeList = "Green": "#+!^Enter", "Red": "#+!^F2"
Var := "Green"
List := {"%KeyCodeList%"}
if List.HasKey(Var) {
    MsgBox, % List[Var]
} Else MsgBox нет
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Сравнение переменной со списком, и назначение новой.

А возможно ли вместо списка использовать переменную?

В контексте представленного вами кода — нет.

Вы желаете заполнять массив данными из строки? Или осуществлять поиск по строке?

25

Re: AHK: Сравнение переменной со списком, и назначение новой.

creature.ws пишет:

А возможно ли вместо списка использовать переменную?

В контексте представленного вами кода — нет.

Вы желаете заполнять массив данными из строки? Или осуществлять поиск по строке?

Вопрос не понятен. Не понимаю термины
Нужно сравнение, например если Var := "Green" то на выходе нужно #+!^Enter. А сам список нужен в переменной, так как будет постоянно изменятся.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

26

Re: AHK: Сравнение переменной со списком, и назначение новой.

Что мешает изменять данные в массиве?
Писать всё в одну строку, а потом разбирать содержимое — неудобно.

27

Re: AHK: Сравнение переменной со списком, и назначение новой.

Плохо понимаю что такое массив, если бы я понимал что Вы предлагаете, наверное так бы и сделал.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Сравнение переменной со списком, и назначение новой.

Отлично, правильный подход, ссылку на источник знаний привести?

Var := "Ложка"
List := {"Документы": A_MyDocuments, "Ложка": "Деревянная"} ; создание ассоциативного массива.
if List.HasKey(Var) { ; вызов встроенного метода
Var2 := List[Var] ; получение данных из массива
    MsgBox, %Var2% 
} Else MsgBox нет

29 (изменено: serzh82saratov, 2012-08-26 20:49:50)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Что мешает изменять данные в массиве?

"Документы": A_MyDocuments, "Ложка": "Деревянная" то что это и есть массив в принципе понятно.
Но как изменять данные в массиве. Я же не могу записать туда что то пока выполняется сам скрипт.
Сам массив изначально читается из другого файла.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Сравнение переменной со списком, и назначение новой.

Я же не могу записать туда что то пока выполняется сам скрипт.

Почему вы так считаете?

Но как изменять данные в массиве

На этот и другие базовые вопросы о массивах есть ответы в соответствующих разделах справки.

31

Re: AHK: Сравнение переменной со списком, и назначение новой.

Я же не могу записать туда что то пока выполняется сам скрипт.

Почему вы так считаете?

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

Но как изменять данные в массиве

На этот и другие базовые вопросы о массивах есть ответы в соответствующих разделах справки.

К сожалению несмог найти (или понять), мне бы пример кода

P.S. Сам массив изначально читается из другого файла.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

32 (изменено: creature.ws, 2012-08-26 21:08:36)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Objects, Object

33

Re: AHK: Сравнение переменной со списком, и назначение новой.

Массив это абстрактная структура данных, т.е. это не строка текста в файле, а некий объект который вы можете использовать.

Например появился в переменной текст "Green": "#+!^Enter", "Red": "#+!^F2" как мне его сравнить с помощью функции List[Var] ?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

34

Re: AHK: Сравнение переменной со списком, и назначение новой.

List[Var] — не функция.

35

Re: AHK: Сравнение переменной со списком, и назначение новой.

Ссылки хорошие. Спасибо. Но мне без вашей помощи не разобратся.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

36

Re: AHK: Сравнение переменной со списком, и назначение новой.

Var := "Ложка"
List := {"Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"}
MsgBox, % List[Var]

А возможно ли это использовать также и в обратном порядке? То есть если "Железная" то на выходе "Вилка".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

37

Re: AHK: Сравнение переменной со списком, и назначение новой.

List := {"Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"}

for k, v in List
   continue
until v = "Железная"

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

38 (изменено: serzh82saratov, 2012-09-01 15:22:39)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Спасибо. А как сделать что если нет совпадений, то MsgBox не появлялся. То есть если v = "Что то" то не появлялся бы "Стакан"

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

39 (изменено: creature.ws, 2012-09-01 19:14:57)

Re: AHK: Сравнение переменной со списком, и назначение новой.

List := {"Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"}
msgbox % List.HasValue("Стеклянный")

class _Object
{
    HasValue(value)
    {
        for k, v in this
            If (v = value)
                return k
        return false
    }
}

Object(prm*)
{
    obj := new _Object
    Loop % prm.MaxIndex()//2
        obj[prm[A_Index*2-1]] := prm[A_Index*2]
    return obj
}

Customizing Object() and Array()

А лучше — так:

List := {"Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"}
If key := ObjHasValue(List, "Железная")
    msgbox % key

ObjHasValue(obj, value)
{
    for k, v in obj
        If (v = value)
            return k
    return false
}

40

Re: AHK: Сравнение переменной со списком, и назначение новой.

Ого. Спасибо. Думал что, что то очень простое не могу "догнать", а тут вон как всё сложно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

41 (изменено: creature.ws, 2012-09-09 18:54:16)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Всё просто, см. второй пример.

Естественно, примеры выше далеко не универсальны, если несколько ключей будут иметь одинаковое значение будет возвращен первый найденный, если имя ключа будет состоять из строки содержащей лишь ноль — факт этот будет интерпретирован как false

List := {"Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"}
If IsObject(result := ObjSearchValue(List, "Железная"))
    msgbox % "Совпадений: " result.MaxIndex() "`nПервое совпадение: " result[1]

ObjSearchValue(obj, value)
{
    result := []
    for k, v in obj
        (v = value) && result.Insert(k)
    return result.MaxIndex()? result : false
}

42 (изменено: serzh82saratov, 2012-09-01 15:49:11)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Всё просто, см. второй пример.

Лепота!
http://savepic.net/3327722m.jpg

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

43

Re: AHK: Сравнение переменной со списком, и назначение новой.

Change — процедура

Вне Change переменная без изменения потому, что var вне Change и var в Change - две разные переменные, ведь имя переменной — абстракция. Процедуры и функции позволяют при разрастании скрипта оперировать переменными с «нормальными» именами, потому как нет нужды придумывать каждой новой переменной новое уникальное имя, в теле подпрограммы переменные — локальные, видимы лишь «внутри подпрограммы».

Из подпрограммы можно получить доступ к «внешней переменной» если она передана в качестве ByRef параметра, или известен её адрес, или в теле подпрограммы данная переменная объявлена как global, или переменная объявлена как global вне процедуры т.е. является super-global.

Классов в ahk нет, есть возможность создавать объект используя ключевое слово Class, получившийся в результате объект мало чем отличается от созданного вызовом Object() или использованием {} или []

44

Re: AHK: Сравнение переменной со списком, и назначение новой.

Большое спасибо за подробный ответ. Теперь всё ясно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

45 (изменено: serzh82saratov, 2013-02-13 21:48:26)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Уважаемые господа. Подскажите как получить только первые и только вторые значения ассоциативного массива, не зная значения переменной Var?
То есть:
MsgBox 1 - Стакан|Вилка|Ложка
MsgBox 2 - Стеклянный|Железная|Деревянная

Var = "Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"
List := {Var}

MsgBox 1 - %Only_first_Item%
MsgBox 2 - %Only_second_Item%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

46 (изменено: creature.ws, 2013-02-14 00:01:46)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Продемонстрируйте менее абстрактный образец кода

47

Re: AHK: Сравнение переменной со списком, и назначение новой.

А в чём заключается "абстрактность" образца?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

48

Re: AHK: Сравнение переменной со списком, и назначение новой.

serzh82saratov пишет:
Var = "Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"
List := {Var}

Так задать ассоциативный массив не получится. То, что ты называешь "первыми" и "вторыми" значениями, на самом деле является ключами и их значениями. Отдельно их можно получить так:

List := {"Стакан": "Стеклянный", "Вилка": "Железная", "Ложка": "Деревянная"}

for k, v in List
   keys .= (A_Index = 1 ? "" : "|") . k
 , values .= (A_Index = 1 ? "" : "|") . v
 
 MsgBox, % "keys = " keys "`nvalues = " values
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

49 (изменено: creature.ws, 2013-02-14 00:08:12)

Re: AHK: Сравнение переменной со списком, и назначение новой.

serzh82saratov, вы хотите сказать, что код из сообщения #46 работает?

50

Re: AHK: Сравнение переменной со списком, и назначение новой.

teadrinker
Большое спасибо!
Вот как бы мне ещё создать "List" прочитав его из переменной???

creature.ws пишет:

serzh82saratov, вы хотите сказать, что код из сообщения #46 работает?

Конечно нет. Это просто кусок кода для наглядности задачи, и экономии времени тех кто может её решить путём копирования его фрагментов.
Так и непонял в чём абстрактность, и что бы я мог ещё добавить к своему вопросу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

51

Re: AHK: Сравнение переменной со списком, и назначение новой.

Вы бы могли не использовать в коде List := {var}. Так как подобный синтаксис в autohotkey не применим, то за этим «куском кода» может скрываться что угодно и речь может идти не о парах ключ: значение.
В коде представленном «для наглядности задачи» неоднозначной может быть лишь реализация этой задачи (по моему скромному мнению)

52 (изменено: serzh82saratov, 2013-02-14 00:58:12)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Реализация задачи скорее всего неправильная. А собственно требуется в однострочной переменной поместить пары значений. И заранее зная что значение "левое" (в паре) при нахождении его в строке получать "правое" от него, и наоборот - находим правое получаем левое.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

53

Re: AHK: Сравнение переменной со списком, и назначение новой.

serzh82saratov пишет:

Вот как бы мне ещё создать "List" прочитав его из переменной???

Из справки: Insert [AHK_L 31+]

Inserts key-value pairs into the object, automatically adjusting existing keys if appropriate.

Object.Insert(Index, Value1 [, Value2, ... ValueN ])
Object.Insert(Value)
Object.Insert(Key, Value)

Как извлекать из строковой переменной пару ключ:значение - на ваше усмотрение.

54

Re: AHK: Сравнение переменной со списком, и назначение новой.

Irbis
А пример можно?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

55

Re: AHK: Сравнение переменной со списком, и назначение новой.

Insert [AHK_L 31+]
Читал я это, но увы недоходит... Поскорее бы появился перевод.
Так можно как-то решить мой вопрос с помощью встроенных функций АНК?
Или только самому создавать функкцию на основе перебора переменной регулярными выражениями?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

56

Re: AHK: Сравнение переменной со списком, и назначение новой.

Не совсем понятно, что дано, и что ты хочешь получить, и, главное, зачем это нужно?

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

57 (изменено: serzh82saratov, 2013-02-14 03:17:33)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Ну вот сейчас например есть ас.массив WindowList. Мне надо в зависимости от активного окна изменять значение Config. Т.е. если процесс окна notepad++.exe то Config = Блокнот
и.т.д. Но теперь понадобилось чтобы содержимое ас.массива было в ини файле.


WindowList := {"XBMC.exe": "XBMC","notepad++.exe": "Блокнот","notepad.exe": "notepad"}
ВклОбщий = 1
Loop
{
WinGet, Process, ProcessName, A
WinGet, PID, PID, A
If (PID = "" || Process = "")
Continue
Result := % WindowList[Process]       ;%

If (ВклОбщий = 1 && Result = "")
{
    If Config = Общий
    {
    WinWaitNotActive, ahk_pid %PID%
    Continue
    }
 Config = Общий
 For a1, value in b1
 Continue 
 Until value = Config
tooltip  %Config%
 WinWaitNotActive, ahk_pid %PID%
 Continue
}

If (Result = Config || Result = "")
{
WinWaitNotActive, ahk_pid %PID%
Continue
}

Config = %Result%
For a1, value in b1
Continue 
Until value = Config
tooltip  %Config%
WinWaitNotActive, ahk_pid %PID%
}
Return

Или в массиве b1 находятся названия Config-ов, и по нажатию хоткея нужно включать всегда следующий по списку. Соответственно содержание массива должно быть тоже в переменной.

b1 := ["Общий","Блокнот","XBMC","notepad"] 
Config := b1[a1]
Config := "Блокнот"
For a1, value in b1
Continue 
Until value = Config
Return
1::
Config := b1[a1 :=  (!a1) ||  (a1>=b1.MaxIndex()) ? 1 : a1+1]
For a1, value in b1
Continue 
Until value = Config
tooltip  %Config% x %a1%  
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

58 (изменено: serzh82saratov, 2013-02-14 03:26:02)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Вот всё вместе, просто поменяйте названия процессов в WindowList, и смотрите на tooltip при активации окон.
Кнопка "1" переключает режимы.

+ открыть спойлер

WindowList := {"XBMC.exe": "XBMC","notepad++.exe": "Блокнот","notepad.exe": "notepad"}
b1 := ["Общий","Блокнот","XBMC","notepad"] 
Config := b1[a1]
Config := "Блокнот"
For a1, value in b1
Continue 
Until value = Config

ВклОбщий = 1
Loop
{
WinGet, Process, ProcessName, A
WinGet, PID, PID, A
If (PID = "" || Process = "")
Continue
Result := % WindowList[Process]       ;%

If (ВклОбщий = 1 && Result = "")
{
    If Config = Общий
    {
    WinWaitNotActive, ahk_pid %PID%
    Continue
    }
 Config = Общий
 For a1, value in b1
 Continue 
 Until value = Config
tooltip  %Config%
 WinWaitNotActive, ahk_pid %PID%
 Continue
}

If (Result = Config || Result = "")
{
WinWaitNotActive, ahk_pid %PID%
Continue
}

Config = %Result%
For a1, value in b1
Continue 
Until value = Config
tooltip  %Config%
WinWaitNotActive, ahk_pid %PID%
}
Return

1::
Config := b1[a1 :=  (!a1) ||  (a1>=b1.MaxIndex()) ? 1 : a1+1]
For a1, value in b1
Continue 
Until value = Config
tooltip  %Config% x %a1%  
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

59

Re: AHK: Сравнение переменной со списком, и назначение новой.

Всё равно не понял, что этот код делает. Сильное подозрение, что всё это можно написать как-то более рационально.

serzh82saratov пишет:

Соответственно содержание массива должно быть тоже в переменной.

Видимо, ты как-то неправильно используешь массивы. Не припомню такого случая, чтобы содержание массива нужно было считывать в переменную.
Если объяснишь подробнее глобальную задачу, постараюсь помочь.

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

60 (изменено: serzh82saratov, 2013-02-14 03:47:56)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Это кусок кода из программы для переназначения кнопок через ГУИ интерфейс. Соответственно все данные вводит пользователь. Сейчас программа на основе введённых данных редактирует файл скрипта АНК, который собственно выполняет всё введённое. Сейчас хочу переделать, чтобы все настройки и действия были в ини файле.

Всё равно не понял, что этот код делает.

Или вопрос именно в коде.

Сильное подозрение, что всё это можно написать как-то более рационально.

Буду премного благодарен за очередной ваш урок.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

61 (изменено: serzh82saratov, 2013-02-14 04:21:37)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Или вопрос именно в коде.

Ниже в коде присутствуют строки вида:

#IF Config = "Блокнот"

и под ними хоткеи которые выполняются в зависимости от значения Config. Приведённый код собственно обеспечивает контекстную зависимостью хоткеев в зависимости от активных окон. По некоторым веским причинам пришлось идти исходя от имени процесса окна, а не от WinTitle, WinText. Переменная "ВклОбщий" если = 1 то переключает на общий режим, если окно\процесс связанный с режимом перестало быть активным, или оставляет режим прежним после деактивации окна.

В обоих случаях не принимается во внимание, если новое активное окно (его процесс) связано с каким-то другим режимом.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

62 (изменено: serzh82saratov, 2013-02-14 17:18:32)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Получилось всё очень просто:

+ открыть спойлер

ProcessConfigList := " XBMC.exe : XBMC |  notepad++.exe : Блокнот | notepad.exe : notepad "
StringSplit, ProcessConfigList, ProcessConfigList, |, %A_Space%
Process = notepad++.exe
MsgBox % IsConfig(Process)  ;%
Return

IsConfig(Process)
{
Global
Loop, %ProcessConfigList0%
{
If RegExMatch( ProcessConfigList%a_index%, "S)^\Q" Process "\E \: (.*+)", a)
Return a1
}
Return ""
}

&&


ConfigList = Общий|Блокнот|XBMC|notepad
StringSplit, ConfigList, ConfigList, |
Config = НеConfig
Return

1::
Loop, %ConfigList0%
{
If (ConfigList%a_index% == Config)
{
a := A_Index+1
Config := A_Index = ConfigList0 ? ConfigList1 : ConfigList%a%
break
}
If A_Index = %ConfigList0%
Config = %ConfigList1%
}
tooltip  %Config% 
Return

наверно что-то не учёл, но так как символ "|" и ":" в моём случае неможет быть ни в key ни в value, то пойдёт. Хотя синтаксис можно усложнять без ущерба производительности при каждом вызове. Для производительности (второго кода) можно создать переменную с номером текущего значения в массиве.
И интересно по поводу скорости выполнения, это намного хуже чем варианты с массивами?
И по какому принципу строится извлечение значений из ас.массива в АНК?

Забыл сказать, что при выполнении скрипта "самопальные массивы" не будут изменятся.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

63 (изменено: serzh82saratov, 2013-02-14 17:42:57)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Наконец-то!  дошло про Insert(match):


b1 := [] 
ConfigList = Общий|Блокнот|XBMC|notepad
StringSplit, ConfigList, ConfigList, |
Loop, %ConfigList0%
b1.Insert(ConfigList%A_Index%)
1::
Config := b1[a1 :=  (!a1) ||  (a1>=b1.MaxIndex()) ? 1 : a1+1]
For a1, value in b1
Continue 
Until value = Config
tooltip  %Config% x %a1%  
Return

&&&


ProcessConfigList = XBMC.exe: XBMC|notepad++.exe: Блокнот|notepad.exe: notepad
StringSplit, ProcessConfigList, ProcessConfigList, |

WindowList := {} 
Loop, %ProcessConfigList0%
RegExMatch( ProcessConfigList%A_Index%, "^(.*?)\: (.*?)$", match) , WindowList.Insert(match1, match2)
Process = notepad++.exe
MsgBox % WindowList[Process]      ;%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

64 (изменено: creature.ws, 2013-02-14 18:27:50)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Можно и без StringSplit с RegexMatch

processConfigList := "XBMC.exe: XBMC|notepad++.exe: Блокнот|notepad.exe: notepad"
WindowList := {}

loop, Parse, processConfigList, |:, %A_Space%
    Mod(A_Index, 2)? key := A_LoopField : WindowList.Insert(key, A_LoopField)

MsgBox % WindowList["notepad++.exe"]

В виде функции: (во имя добра)

ObjFromString(ByRef string, d0 := ",", d1 := ":", ommitChars := " `t") {
    Obj := {}

    loop, Parse, string, % d0 d1, % ommitChars
        Mod(A_Index, 2)? key := A_LoopField : Obj.Insert(key, A_LoopField)

    return Obj
}

o := ObjFromString("k0 : v0 |k1: v1", "|")
MsgBox %  o.k0 " " o.k1

65

Re: AHK: Сравнение переменной со списком, и назначение новой.

creature.ws
Красиво.
Узнал что Pars-ить можно через несколько символов!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

66 (изменено: serzh82saratov, 2013-02-17 15:32:20)

Re: AHK: Сравнение переменной со списком, и назначение новой.

Интересная строка:

MsgBox %  o.k0 " " o.k1

а можно-ли чем-то заменить:

For a1, value in b1
Continue 
Until value = Config

в #64, чтобы при каждом изменении Config не требовалось получать индекс значения?
--------------

+ открыть спойлер

b1 := []  , ConfigList := "Общий|Блокнот|XBMC|notepad"
loop, Parse, ConfigList, |
b1.Insert(A_LoopField) MaxIndex := A_Index , FirstConfig := A_Index = 1 ? A_LoopField : FirstConfig , Config := FirstConfig
1::
d_1 = 
loop, Parse, ConfigList, |
{ d_1 := A_LoopField == Config ? A_Index+1 : d_1
If (d_1 = A_Index || d_1 > MaxIndex)
      Config := d_1 > MaxIndex ? FirstConfig : A_LoopField , d_1 := 0
}  Until d_1 = 0
tooltip  %Config%
Return

В принципе массив и ненужен


ConfigList := "Общий|Блокнот|XBMC|notepad|"
loop, Parse, ConfigList, |
FirstConfig := A_Index = 1 ? A_LoopField : FirstConfig , Config := FirstConfig
1::
loop, Parse, ConfigList, |
{ d_1 := A_LoopField == Config ? A_Index+1 : d_1 , d_2 := 1
If (d_1 = A_Index || !A_LoopField)
      Config := !A_LoopField ? FirstConfig : A_LoopField , d_2 := 0
}  Until d_2 = 0
tooltip  %Config%
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

67 (изменено: serzh82saratov, 2013-02-16 04:42:38)

Re: AHK: Сравнение переменной со списком, и назначение новой.

teadrinker пишет:

Сильное подозрение, что всё это можно написать как-то более рационально

Постарался уменьшить код:

+ открыть спойлер

ConfigList = :Общий|XBMC.exe:XBMC|notepad++.exe:Блокнот|notepad.exe:notepad
Config_Arr := {} , ConfigList_Arr := {} , ConfigArrIndex = 0

loop, Parse, ConfigList, |:
Mod(A_Index, 2) ? key := A_LoopField : Config_Arr.Insert(key, A_LoopField)  ConfigList_Arr.Insert(A_LoopField) ConfigArrIndex += 1
1::
Config := ConfigList_Arr[Index := (!Index) || (Index>=ConfigArrIndex) ? 1 : Index+1]
For Index, Value in ConfigList_Arr
Continue 
Until Value = Config
tooltip  %Config%
return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

68 (изменено: serzh82saratov, 2013-02-19 03:35:10)

Re: AHK: Сравнение переменной со списком, и назначение новой.

teadrinker пишет:

Сильное подозрение, что всё это можно написать как-то более рационально

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

Упразднил (и наверно зря) создание второго массива ( ConfigList_Arr - код выше), который требовался мне для цикличного извлечения значений из ас. массива.
Хотелось бы услышать замечания.

+ открыть спойлер

ConfigList = :Общий|XBMC.exe:XBMC|notepad++.exe:Блокнот|notepad.exe:notepad
Config_Arr := {} , ConfigArrIndex := "0"
    loop, Parse, ConfigList, |:
        Mod(A_Index, 2) ? key := A_LoopField : Config_Arr.Insert(key, A_LoopField) ConfigArrIndex += 2  ,  FirstConfig := A_Index = 2 ? A_LoopField : FirstConfig
Config := FirstConfig
1::
    d_1 =
    loop, Parse, ConfigList, |:
        {   d_1 := !Mod(A_Index, 2) && A_LoopField == Config ? A_Index+2 : d_1
        If (d_1 = A_Index || d_1 > ConfigArrIndex)
            Config := d_1 > ConfigArrIndex ? FirstConfig : A_LoopField , d_1 := 0
        }  Until d_1 = 0
    tooltip  %Config%
    return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

69

Re: AHK: Сравнение переменной со списком, и назначение новой.

strList:=":Общий,XBMC.exe:XBMC,notepad++.exe:Блокнот,notepad.exe:notepad"
oDict:=ComObjCreate("Scripting.Dictionary"), cnt:=0

Loop, Parse, strList, % ":,"
   Mod(A_Index, 2) ? key:=A_LoopField : oDict.Add(key, A_LoopField)

1::
   TrayTip, % "key: '"oDict.Keys()[cnt]"'", % "item: '"oDict.Items()[cnt]"'"
   KeyWait, % A_ThisHotkey
   cnt++
   cnt:=cnt=oDict.Count ? 0 : cnt
   Return

70

Re: AHK: Сравнение переменной со списком, и назначение новой.

Ого, это интересно. Не могли бы вы вкратце рассказать про строки:

oDict.Keys()[cnt]

и

ComObjCreate("Scripting.Dictionary")
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

71

Re: AHK: Сравнение переменной со списком, и назначение новой.

Dictionary Object (EN/RU).