1 (изменено: serzh82saratov, 2013-03-17 00:55:15)

Тема: AHK: Перемещение текстового фрагмента в переменной

Не знаю насколько коректно назвал тему, как смог вообщем
Собственно есть переменная, она используется как список например в ListBox, 1 - верх и 4 - низ списка:
Var = 1|2|3|4|
Хочется "сообразить" две кнопки Вверх и Вниз. Например если выбрана 1 и один раз нажать кнопку Вниз, то на выходе хочется иметь:
Var = 2|1|3|4|
а если нажать кнопку Вверх (при изначальном значении Var), то хочется иметь:
Var = 2|3|4|1|

Var = 1|2|3|4|
Select = 1

1::  ; Вверх
???
MsgBox %Var%
Return
2::  ; Вниз
???
MsgBox %Var%
Return

Спасибо.

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

_______ MY_ARRAY _______






Arr = vkA6:RWin|vkA4:LAlt|!!!!!!!:KJCM|vkA5:RAlt|vkA2:LCtrl|vkA3:RCtrl|vkA0:LShift|vkA1:RShift|vk5B:LWin
Key := "vkA6"
Val := "LWin"
NewKey = Замена ключа
NewVal = Замена значения
    Return
    msgbox,,RemoveKeyValue, % RemoveKeyValue(Arr, "", Val)
    msgbox,,RemoveKeyValue, % RemoveKeyValue(Arr, Key)
    msgbox,,ChangeValue, % ChangeValue(Arr, Key, NewVal)
    msgbox,,ChangeKey, % ChangeKey(Arr, Val, NewKey)
    msgbox,,GetKey, % GetKey(Arr, Val)
    msgbox,,GetValue, % GetValue(Arr, Key)
    Return
3::
    msgbox % "0   " . S . "`r1   " . S1 . "`r2   " . S2 . "`r3   " . S3
    Return
1::
    ToolTip % Arr := MoveKeyValue(Arr, "L", Key)
    Return
2::
    ToolTip % Arr := MoveKeyValue(Arr, "", "", Val)
    Return

MoveKeyValue(Arr, Shift, Key = "", Val = "") {   
    (Val = "") ? Val := GetValue(Arr, Key) : (Key = "") ? Key := GetKey(Arr, Val)   
    If (Shift = "L")
    { If RegExMatch(Arr, "(^\Q" Key ":" Val "\E)\|", S)
            Return RegExReplace(Arr, "^(\Q" S "\E)", "","",1) . "|" . S1 
        RegExMatch(Arr, ".*(^|\|)(.*?:.*?)?(\|)\Q" Key ":" Val "\E($|\|).*", S)
        Return RegExReplace(Arr, "(^|\|)\Q" S2 "|" Key ":" Val "\E($|\|)", "$1" Key ":" Val "|" S2 "$2","",1)
    } If RegExMatch(Arr, ".*\|(\Q" Key ":" Val "\E)$.*", S)
        Return S1 . "|" . RegExReplace(Arr, "(\Q|" S1 "\E)", "","",1)
    Return RegExReplace(Arr, "(^|\|)\Q" Key ":" Val "|\E(.*?:.*?)?($|\|)", "$1$2|" Key ":" Val "$3" )
}   
ChangeValue(Arr, Key, NewVal) {
    RegExMatch(Arr, ".*(^|\|)\Q" Key "\E:(.*?)?($|\|).*", S)
    Return RegExReplace(Arr, "\Q" S1 "" Key ":" S2 "" S3 "\E", "" S1 "" Key ":" NewVal "" S3 "", "",1)
}
ChangeKey(Arr, Val, NewKey) {
    RegExMatch(Arr, ".*(^|\|)(.*?)?:\Q" Val "\E($|\|).*", S)
    Return RegExReplace(Arr, "\Q" S1 "" S2 ":" Val "" S3 "\E", "" S1 "" NewKey ":" Val "" S3 "", "",1)
}
GetValue(Arr, Key) {
    RegExMatch(Arr, ".*(^|\|)\Q" Key "\E:(.*?)?($|\|).*", S)
    Return S2
}
GetKey(Arr, Val) {
    RegExMatch(Arr, ".*(^|\|)(.*?)?:\Q" Val "\E($|\|).*", S)
    Return S2
} 
RemoveKeyValue(Arr, Key = "", Val = "") { 
    (Val = "") ? Val := GetValue(Arr, Key) : (Key = "") ? Key := GetKey(Arr, Val)     
    Return RTrim(RegExReplace(Arr, "(^|\|)\Q" Key ":" Val "\E($|\|)", "$1","",1), "|")
}

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

2

Re: AHK: Перемещение текстового фрагмента в переменной

Советую обратить особое внимание на функцию mod().

3 (изменено: serzh82saratov, 2012-10-20 15:24:17)

Re: AHK: Перемещение текстового фрагмента в переменной

Не могу понять как её пользовать...

Mod(Dividend, Divisor): Modulo. Returns the remainder when Dividend is divided by Divisor. The sign of the result is always the same as the sign of the first parameter. For example, both mod(5, 3) and mod(5, -3) yield 2, but mod(-5, 3) andmod(-5, -3) yield -2. If either input is a floating point number, the result is also a floating point number. For example, mod(5.0, 3) is 2.0 and mod(5, 3.5) is 1.5. If the second parameter is zero, the function yields a blank result (empty string).

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

4

Re: AHK: Перемещение текстового фрагмента в переменной

Если нумеровать элементы с нуля, то после циклического сдвига с k-той позиции на n позиций вправо, элемент окажется на позиции Mod(k+n, Size), где Size количество элементов в списке.

5 (изменено: serzh82saratov, 2012-10-20 20:53:59)

Re: AHK: Перемещение текстового фрагмента в переменной

Т.е. через Loop, Parse определяем Size. Через него же определяем k. А как в итоге получить текстовую переменную нубу совсем непонятно.
---------------
вобщем более чем на кусок индусского кода пока "фантазии" у меня не хватило:

Var = 1w|2w|3w|4w|
Select = 1w

1::  ; Вниз
Loop, Parse, Var, |
{
if A_LoopField = %Select%
{
Next := (A_Index+1)
Loop, Parse, Var, |
if A_Index = %Next%
{
Next = %A_LoopField%
break
}
}
}
if Next =
{
StringReplace, Var, Var, %Select%|
Var = %Select%|%Var%
MsgBox %Var%
Return
} Else
Var := RegExReplace(Var, "" Select "\|" Next "\|", "" Next "|" Select "|")
MsgBox %Var%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6 (изменено: serzh82saratov, 2012-10-20 21:29:42)

Re: AHK: Перемещение текстового фрагмента в переменной

решил свой вопросик таким быдло кодом:

Var = 1w|2w|3w|4w|
Select = 2w

1::  ; Вниз
Loop, Parse, Var, |
{
if A_LoopField = %Select%
{
Next := (A_Index+1)
Loop, Parse, Var, |
if A_Index = %Next%
{
Next = %A_LoopField%
break
}
}
}
if Next =
{
StringReplace, Var, Var, %Select%|
Var = %Select%|%Var%
MsgBox %Var%
Return
} Else
Var := RegExReplace(Var, "" Select "\|" Next "\|", "" Next "|" Select "|")
MsgBox %Var%
Return

2::  ; Вверх
Loop, Parse, Var, |
{
if A_LoopField = %Select%
{
Next := (A_Index-1)
Loop, Parse, Var, |
if A_Index = %Next%
{
Next = %A_LoopField%
break
}
}
}
if Next = 0
{
StringReplace, Var, Var, %Select%|
Var = %Var%%Select%|
MsgBox %Var%
Return
} Else
Var := RegExReplace(Var, "" Next "\|" Select "\|", "" Select "|" Next "|")
MsgBox %Var%
Return

если у кого то будет идея, хотелось бы увидеть более "симпатяшное" решение.

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

7

Re: AHK: Перемещение текстового фрагмента в переменной

Хочется "сообразить" две кнопки Вверх и Вниз. Например если выбрана 1 и один раз нажать кнопку Вниз, то на выходе хочется иметь:
Var = 2|1|3|4|
а если нажать кнопку Вниз (при изначальном значении Var), то хочется иметь:
Var = 2|3|4|1|

Не понимаю. Может, во втором случае нажимается кнопка Вверх? Вообще поясните, что за "Вниз" - вниз на одну позицию или в низ списка?

8 (изменено: serzh82saratov, 2012-10-20 22:33:19)

Re: AHK: Перемещение текстового фрагмента в переменной

ypppu пишет:

Хочется "сообразить" две кнопки Вверх и Вниз. Например если выбрана 1 и один раз нажать кнопку Вниз, то на выходе хочется иметь:
Var = 2|1|3|4|
а если нажать кнопку Вниз (при изначальном значении Var), то хочется иметь:
Var = 2|3|4|1|

Не понимаю. Может, во втором случае нажимается кнопка Вверх? Вообще поясните, что за "Вниз" - вниз на одну позицию или в низ списка?

Да, именно Вверх, извиняюсь за ошибку, поправил.

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

9

Re: AHK: Перемещение текстового фрагмента в переменной

Вообще поясните, что за "Вниз" - вниз на одну позицию или в низ списка?

вниз на одну позицию.

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

10

Re: AHK: Перемещение текстового фрагмента в переменной

Ещё вопрос. Вам требуется универсальный алгоритм или для данного конкретного случая?

11

Re: AHK: Перемещение текстового фрагмента в переменной

Хочется конечно и то и другое посмотреть)

Ибо не факт что универсальный - я смогу оптимизировать под данный случай(
Или тот что для данного конкретного случая - оптимизировать потом под что то другое(

Раз уж приходится выбирать, подскажите универсальный)

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

12

Re: AHK: Перемещение текстового фрагмента в переменной

Если только на одну позицию, то вообще не вижу проблемы:

List := "1w|2w|3w|4w|"
1::
LastSep := InStr(List, "|", true, -1)
List := SubStr(List, LastSep+1, StrLen(List)-LastSep) SubStr(List, 1, LastSep)
msgbox % List
return
Esc::ExitApp

В принципе по аналогии можно и для любого сдвига сделать, вариант с mod предполагал, что парсить строку не придётся.

13

Re: AHK: Перемещение текстового фрагмента в переменной

Если для конкретного случая

2::  ; Вниз
If Var = 1|2|3|4|
   Var = 2|1|3|4|
If Var = 2|1|3|4|
   Var = 2|3|1|4|

и так далее.
Если универсальный, я бы использовал RegEx, но Вы уже применили его.

14

Re: AHK: Перемещение текстового фрагмента в переменной

Если для конкретного случая

А ну это конечно просто пример был
Не настолько конкретно.

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

15

Re: AHK: Перемещение текстового фрагмента в переменной

Александр_ пишет:

Если только на одну позицию, то вообще не вижу проблемы:

List := "1w|2w|3w|4w|"
1::
LastSep := InStr(List, "|", true, -1)
List := SubStr(List, LastSep+1, StrLen(List)-LastSep) SubStr(List, 1, LastSep)
msgbox % List
return
Esc::ExitApp

В принципе по аналогии можно и для любого сдвига сделать, вариант с mod предполагал, что парсить строку не придётся.

Красиво. И всё красивое как всегда мне непонятно(
Оно манипулирует 1w. А как указать к примеру 2w по имени?

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

16

Re: AHK: Перемещение текстового фрагмента в переменной

serzh82saratov пишет:

Оно манипулирует 1w. А как указать к примеру 2w по имени?

Неа. LastSep := InStr(List, "|", true, -1) получает позицию разделителя между 3w и 4w. Далее часть строки правее этого разделителя помещается в начало, а часть левее и сам разделитель в конец.

17 (изменено: serzh82saratov, 2012-10-20 23:19:59)

Re: AHK: Перемещение текстового фрагмента в переменной

Александр_ пишет:
serzh82saratov пишет:

Оно манипулирует 1w. А как указать к примеру 2w по имени?

Неа. LastSep := InStr(List, "|", true, -1) получает позицию разделителя между 3w и 4w. Далее часть строки правее этого разделителя помещается в начало, а часть левее и сам разделитель в конец.

Теперь совсем туго. Непонятно "кто и как его просит" получать позицию разделителя именно между 3w и 4w.

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

18

Re: AHK: Перемещение текстового фрагмента в переменной

InStr(Haystack, Needle [, CaseSensitive?, StartingPos]): возвращает позицию первого вхождения строки Needle в строку Haystack. В отличие от команды StringGetPos, позиция 1 является первым символом, так как 0 - синоним "false" и является интуитивным индикатором "не найдено". Если параметр CaseSensitive опущен или ложен, поиск не чувствителен к регистру; иначе, регистр должен точно совпадать. Если параметр StartingPos опущен, то по умолчанию он равен 1 (начало строки Haystack). Иначе, задайте 2, чтобы начать со второго символа строки Haystack, 3 - с третьего, и т.д. Если параметр StartingPos больше, чем количество символов Haystack, возвращается 0. Если StartingPos равен 0, поиск проводится в обратном порядке (справа налево), с тем, чтобы найти соответствие, находящееся правее остальных. Вне зависимости от значения параметра StartingPos, возвращаемая позиция всегда соотносится с первым символом Haystack. Например, позиция строки "abc" в строке "123abc789" всегда 4. Похожие команды: IfInString и StringGetPos.

В данном случае начальная позиция "-1", т.е. поиск должен идти справа налево, начиная с предпоследнего символа.

19

Re: AHK: Перемещение текстового фрагмента в переменной

Спасибо Вам. Пошёл чесать голову. Вроде что-то дошло )

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