1 (изменено: cahtbap1, 2017-05-11 13:42:37)

Тема: AHK: Обращение к переменной записанной в переменной

Хотел сделать цикл назначения заданных в Gui хоткеев коих 10 на интерпретирование заданных им строк.
Получается примерно так:


gui,submit,nohide
Hnum=0
loop 10
{
Hnum++
if h%Hnum% != ""
{
	if e%Hnum% != ""
	{
		Hotkey,% h Hnum ,print_e%Hnum%
	}
}
}
return

Но выдает ошибку в строке хоткея.
Неприятность в обращении к переменной в переменной:


h1=a
b=1
c=%(h%(b)%)%

Либо подскажите иной способ.

2 (изменено: KusochekDobra, 2017-05-11 15:55:14)

Re: AHK: Обращение к переменной записанной в переменной

Здравствуйте.


h1=a
b=1
c=h%b%
MsgBox,, Title,% %c%
MsgBox,, Title,% h%b%

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

UPD:
Корректней запись будет выглядеть так:


h1 := "a"
b := 1
c :=% "h" b

Здесь каждое строковое представление явно обозначено границами кавычек. Код оформленный таким образом с меньшей вероятностью заводит в тупик при изучении.

3

Re: AHK: Обращение к переменной записанной в переменной

h1 := "a", b := 1, c := h%b%
MsgBox % c

В параметрах команды Hotkey в вашем коде не хватает 3 знаков %.

4

Re: AHK: Обращение к переменной записанной в переменной

Хах , спасибо ребят.

5 (изменено: cahtbap1, 2017-05-11 20:44:00)

Re: AHK: Обращение к переменной записанной в переменной

KusochekDobra пишет:

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

Возник вопрос по поводу хоткея на фунцию , но поиск мне почему-то не помогает.
Мне бы заменить 10 Labelов на 1 функцию:


Hotkey,%hh%,print_e%Hnum%
return
print_e:
print(e)
return

На


Hotkey,%hh%,print(ee)

6 (изменено: stealzy, 2017-05-11 21:57:08)

Re: AHK: Обращение к переменной записанной в переменной

hh := "F1", e:="Hotkey", x := Func("print").Bind(e)
Hotkey % hh, % x

print(x) {
	MsgBox % x
}

7

Re: AHK: Обращение к переменной записанной в переменной

stealzy
Странно ,так не работает:

Hotkey % hh, % Func("print").Bind(ee)

Пишет :
Error: Nonexistent hotkey.
Specifically:1

А так работает:


fn := Func("print").Bind(ee)
Hotkey,% hh,% Func("print").Bind(ee)

8 (изменено: stealzy, 2017-05-11 22:02:27)

Re: AHK: Обращение к переменной записанной в переменной

Опередили, а я ток исправил. Забыл про ограничения языка.
В вашем коде наверно опечатка - в Hotkey должен стоять уже % fn.
См. мое предыдущее сообщение.

9 (изменено: Indomito, 2017-05-12 04:37:46)

Re: AHK: Обращение к переменной записанной в переменной

cahtbap1
Вот готовый набор функций в одном модуле.

+ SetHotKeys.ahk
;----------------fnHotkey = основная функция генерации Hotkey--------------------------------------------
;На вход
;1-й Переменная это строка из INI содержащая клавиши не более трёх
;2-й Метка - она должна быть
;3-й Включит/выключить True/False. Включить по умолчанию
;4-й Проверять(по умолчанию) или не проверять. Рекомендуется не отключать, что бы избежать конфликтов.

;На выход 
;Имя горячей клавиши(строка) ,а при ошибке авто-отработка и выход.
;Значения заносятся в массив. 
;Выходит без проверки и действий при BaseHotkeyFS  := False
fnHotkey(varKeyIn, varLabelIn, varStatusIn:=True, varСheckHotkeyIn:=True)
{
Global ;The directive "global" - should not be an empty string.

;Глобальные константы для справки
;cCrushItself - "$" Когда надо вызывать ту же клавишу внутри её вызова
;cCrushMore   - это для 2-х и 3-х. Дополнить Hotkey "~", т.е. ~Ctrl & Win $10 (~^#10) что бы обойти левые и правые модификаторы
;cCrushAndSPS - это " & "

;Локальные для этой функции переменные(меняются), константы и массивы
Local i, j, iLoop, jLoop
Local vHotKeyWork, cMaxArHotKeyStr, arHotKeyStr, cMaxArHotKeyAsg, arHotKeyAsg, сHotKeyStrErr
;Thread, NoTimers
  if (!StrLen(varKeyIn)) ; Проверка на пустые Hotkey клавиши
            Goto  lFnHotkeyExit
;Инициализация констант, переменных, массивов - это обязательно
  i :=  0, j :=  0, iLoop :=  0, jLoop :=  0
  vHotKeyWork :=  "", cMaxArHotKeyStr :=  0,  arHotKeyStr :=  [], cMaxArHotKeyAsg :=  0,  arHotKeyAsg :=  [], сHotKeyStrErr :=  ""

;------Начинаем работу------

;Расчёт и генерация строк и акнонимов, а так же сHotKeyStrErr если будет ошибка для Hotkey  
  arHotKeyStr     :=  fnParseSPS(varKeyIn)    ;Массив для текста клавиш - они нужны для построения акронимов
  cMaxArHotKeyStr :=  arHotKeyStr.MaxIndex()  ;Расчёт длины, т.е. числа клавиш
  i := 0
  Loop %cMaxArHotKeyStr%
    {
      i++
      arHotKeyAsg[i]  :=  fnAssigKey(arHotKeyStr[i])
    }
  cMaxArHotKeyAsg :=  arHotKeyAsg.MaxIndex()
  
;Построение сочетания клавиш для Hotkey(vHotKeyWork) и генерация строки клавиш для ошибки(сHotKeyStrErr)
  i :=  0,  vHotKeyWork :=  "",  сHotKeyStrErr :=  ""
  Loop %cMaxArHotKeyAsg%
    {
      i++
      If (i = 1)
            сHotKeyStrErr :=  arHotKeyStr[i]
          Else
            сHotKeyStrErr :=  сHotKeyStrErr cCrushAndSPS arHotKeyStr[i]
      vHotKeyWork :=  vHotKeyWork arHotKeyAsg[i]
    }
   
  HotKey %vHotKeyWork%, %varLabelIn%, %cOffHK%, UseErrorLevel  ; Включение HotKey
  MyErrorLevel := ErrorLevel
  If (MyErrorLevel != 0)
    {
        сHotKeyStrErr := "HotKey" cSps сHotKeyStrErr cComma cSps varLabelIn 
      If (MyErrorLevel = 1)
            Error_TXT := "В параметре Label указано несуществующее имя метки."
      If (MyErrorLevel = 2)
            Error_TXT := "Дубликат горячих клавиш или они не поддерживаются системой."
      If (MyErrorLevel = 3)
            Error_TXT := "Неподдерживаемый модификатор горячей клавиши."
      If (MyErrorLevel = 4)
            Error_TXT := "Клавиши не пригодны для эмуляции AltTab или ShiftAltTab."
      If (MyErrorLevel = 5)
            Error_TXT := "Команда пытается изменить несуществующую горячую клавишу."
      If (MyErrorLevel = 6)
            Error_TXT := "Команда пытается изменить несуществующий вариант существующей горячей клавиши."
      If (MyErrorLevel = 98)
            Error_TXT := "Создание данной горячей клавиши превысило лимит в 700 горячих клавиш."
      If (MyErrorLevel = 99)
            Error_TXT := "Недостаточно памяти. Ваша OS нестабильна, требуется очистка и настройка."

      cTitle      :=  "Ошибка в HotKey" ;Титул MsgBox
      cMsgErr     :=  "`n Ошибка в определении - " сHotKeyStrErr
      cTxtErrAd1  :=  "`n`n Тип ошибки :"
      cTxtErrAd2  :=  "`n " Error_TXT
      cWait       :=  35
      cTxtErrAd3  :=  "`n`n Выход из программы(Тайм-аут = " cWait " сек)."
      MsgBox % сMsgBoxError_Ok, %cTitle%, %cMsgErr% %cTxtErrAd1% %cTxtErrAd2% %cTxtErrAd3%, %cWait%      
      Gosub lExitTotalKeys
    }
  
  If (varStatusIn)
          HotKey %vHotKeyWork%, %varLabelIn%, %cOnHK%, UseErrorLevel
  
lFnHotkeyExit:
Return vHotKeyWork
}
;-------------------------------------------------------------------------------------------


;------------------------Функция возврата акронима спец. клавиш--------------------------------
fnAssigKey(KeyIn)
{
 Local i, iLoop, flg
  i := 0, iLoop := 0, flg :=  False
  
  flg   :=  False ;Флаг акронима
  
  iLoop :=  arAssigKey.MaxIndex()
  i     :=  0
  loop %iLoop%
    {
      i++
      if (arAssigKey[i,iAsKeyName] = KeyIn)
          {
            flg  :=  True  ; Нашли акроним
            KeyOut  :=  arAssigKey[i,iAsKeyAcronym], break
          }
   }
  If (flg)
      Return KeyOut ; Акроним нашли, возврат не клавиши, а акронима
    Else
      Return KeyIn ; Акроним не нашли, возврат клавиши, что нам дали на входе
}

;---------------Функция которая убирает пробелы и табуляцию. Возвращает строку сиволов через пробел -------------------
; Если Ar = True то массив,  иначе строка
fnParseSPS(buffer, ar := True)
{
local Arr, i, Row, OutStr
  Arr := [], j := 0, i := 0, Row  := "", OutStr := ""
  Loop, parse, buffer, " "
    { 
      Row := RegExReplace(A_LoopField, """| |" A_Tab)
        If Row is space 
            Continue
      Arr[++i] := Row
    }
  If(ar)
;Возврат массива    
    Return Arr  

;Возврат строки - символы через пробел  
  i := Arr.MaxIndex() 
  Loop %i%
    {
      j++
      ;OutStr  := OutStr Arr[j]
      If (i != j)
          OutStr  := OutStr Arr[j] " "
        Else
          OutStr  := OutStr Arr[j]
    }
Return OutStr
}


Goto leave_FnAr_KES
;----------------------------------Заглушки--------------------------------------------------
;Для ремаппинга клавиш
lPressKeyToMap:
Return

lSentKeyToMap:
Return

;Просто заглушка
lNoLabel: 
Return
;-------------------------------------------------------------------------------------------
leave_FnAr_KES:

Основные константы и массив акронимов.

+ AllMainConst.ahk
;Тут только OK
  сMsgBoxInfo_Ok          :=0+8192+64 ;only an OK button + Task Modal + Icon Asterisk(info)
  сMsgBoxError_Ok         :=0+8192+16 ;only an OK button + Task Modal + Icon Hand (stop/error)  
  сMsgBoxChoice_Ok        :=0+8192+48 ;only an OK button + Task Modal + Icon Exclamation
;Тут Yes/No(Да/Нет) 
  сMsgBoxQuest_YN         :=4+8192+32 ;Yes/No button  + Task Modal + Icon Question
  сMsgBoxInfo_YN          :=4+8192+64 ;Yes/No button + Task Modal +  Icon Asterisk (info)
;Тут OK/Cansel(Да/Отмена)
  сMsgBoxInfo_OK_Cansel   :=1+8192+64 ;OK/Cansel button + Task Modal +  Icon Asterisk (info)
  сMsgBoxChoice_OK_Cansel :=1+8192+48 ;OK/Cansel button + Task Modal + Icon Exclamation
  сMsgBoxQuest_OK_Cansel  :=1+8192+32 ;OK/Cansel button  + Task Modal + Icon Question
  

;Общие определения
; Сокращения и сообщения
cLF        := "`n"
cNone      := ""  ;Это не False, а True
cFreeRec   := "0" ;Для определения пустой записи
cSps       := " " 
cGap       := "—"
cComma     := ","
cNoLbL  := "lNoLabel" ; Метка-заглушка для вывода справки и просто так
cOnHK      := "ON" 
cOffHK     := "OFF"
; Только для Hotkey - не печатыемые символы
cCrushMore    := "~" ; для сочетаний типа Ctrl+Win+10 надо добавить (cCrush)+Ctrl+Win+10
cCrush2       := "*"
cCrush3       := "@"
cCrushItself  := "$"
cCrushAnd     := "&"
cCrushAndSPS  := " & "


;Акронимы и клавиши модификаторы
cMenuWin    := "AppsKey"
cRWin       := "RWin"
cLWin       := "LWin" 
cCtrl       := "Ctrl"
cRCtrl      := "RCtrl"
cLCtrl      := "LCtrl"
cShift      := "Shift"
cRShift     := "RShift"
cLShift     := "LShift"
cAlt        := "Alt"
cRAlt       := "RAlt"
cLAlt       := "LAlt"

iAsKeyName        := 1  ; индекс имени
iAsKeyAcronym     := 2  ; индекс акронима
arAssigKey        :=[[cMenuWin,cMenuWin]
                    ,[cRWin,cRWin], [cLWin,cLWin]
                    ,[cCtrl,"^"], [cRCtrl,">^"],[cLCtrl,"<^"]
                    ,[cShift,"+"],[cRShift,">+"],[cLShift,"<+"]
                    ,[cAlt,"!"],  [cRAlt,">!"],  [cLAlt,"<!"]]

cahtbap1 пишет:

Мне бы заменить 10 Labelов на 1 функцию

Тебе нужна реализация CASE? Могу дать, правда она привязана к коду, но не намертво - общий принцип прост.

+ fnGearSpdBrk
;---
;Main function to dynamically calculate the speed, braking and turning angle corrector, as well as set the flags for timers speed and braking
;---Beginning of function fnGearSpdBrk
fnGearSpdBrk(vParam0, vSpdBrk) ;The values for vSpdBrk (0 - no matter, 1 - speed of the timer, 2 - braking of the timer, 3 and higher - the other subprogramme)
{
;The constants function fnGearSpdBrk and all the subprogrammes who is calling, they are defined above under subprogramme "lVarGameTHQ".
;cFnSB_Learn||cFnSB_Speed||cFnSB_Brake||cFnSB_GT||cFnSB_Boost||cFnSB_Sharp||cFnSB_Turn||cFnSB_Above||
;          1            2            3         4            5            6           7            8

global ;All variables in the function will be global, it is necessary to comment to engage the directive "global" - should not be an empty string.
local fSpdBrk, vMComp, sLabel, vRetFn, vRetResult
static arSpdBrk := ["lFnSB_Learn","lFnSB_Speed","lFnSB_Brake","lFnSB_GT","lFnSB_Boost","lFnSB_Sharp","lFnSB_Turn","lFnSB_Above"] 
static cErFun := "Error in the function `" fnGearSpdBrk `". `n" 
static fRetDone := 0, fRetErr := -1 
  
  sLabel := arSpdBrk[vSpdBrk]
  if (!IsLabel(sLabel))
   {
		 msgbox, % vMsgOptionsEr 
							,Saints Row: The Third
              , %cErFun% Dynamic label with name = "%sLabel%" does not exist.`n`n %сErrOfExit%
              ,30
     ExitApp
    }
  ;a  := arSpdBrk[vSpdBrk]
  ;tooltip %a% = %vSpdBrk%
  vRetFn := fRetDone
  gosub, % arSpdBrk[vSpdBrk]
  if (vRetFn = fRetErr)
    {
		 sbLabel := SubStr(sLabel, 2)
     msgbox, % vMsgOptionsEr 
							,Saints Row: The Third
              , %cErFun% Semantic error in the sub-function = "%sbLabel%" `n`n %сErrOfExit%
              ,30
     ExitApp
    }  

return vRetResult
  
;Fast distillation the car
; cFnSB_Boost := 4
lFnSB_Boost:
  if (fKeyUpTimer) 
      {
        vBoostSpeed++
        if (vBoostSpeed>cBoostSpeed)
            {
              fKeyUpTimer:=false
              gosub lGearAddUp              
              vBoostSpeed := 0
              fKeyUpTimer:=true
              return vRetResult:=false
            }
          else
            return vRetResult:=true
      }
     else
      return vRetResult:=true
      
return vRetFn:=fRetErr

;Fast braking the car
; cFnSB_Sharp := 5
lFnSB_Sharp:
  if (fKeyDnTimer)
      {
        vSharpBrake++
        if (vSharpBrake>cSharpBrake)
            {
              fKeyDnTimer:=false
              gosub lGearAddDn             
              vSharpBrake := 0
              fKeyDnTimer:=true
              return vRetResult:=false ;Allow the timer subroutine work - the speed has changed.
            }
          else
            return vRetResult:=true    ;Forbid the timer subroutine work - speed does not change.        
      }
     else
      return vRetResult:=true         ;If fKeyDnTimer:=false flag allow or deny? As long as I think will be correct - forbid.
          
return vRetFn:=fRetErr

;Block of the control gear shifting
; cFnSB_GT    := 3
lFnSB_GT:
  if (!vRShX)
        return
  if (iGear<>iGearTrc)
        gosub lSetTimerOff
      else
        return
  if (iGear=1)
      {
        fnPlaySoundTHQ(iSoundSpeedMin)
        Goto, lFnSB_GT_Exit 
      }
  if (iGear=cMaxGear)
      {
        fnPlaySoundTHQ(iSoundSpeedMax)
        Goto, lFnSB_GT_Exit
      }  
  if (iGear>=iGearTrc)		
        fnPlaySoundTHQ(iSoundSpeedUp)
      else
        fnPlaySoundTHQ(iSoundSpeedDn)
  lFnSB_GT_Exit:            
      iGearTrc:=iGear			 
      gosub lSetTimerOn
  return     

return vRetFn:=fRetErr

;The block checks the flags and the initial values for the correction of the rotation.
lFnSB_Turn:
    ;fUDLR := True
      Send, {%vParam0% Down}
        sleep %td20_Sleep%
      Send, {%vParam0% Up}    
    ;fUDLR := False    
  return 
      
return vRetFn:=fRetErr
      
;Block checking and setting lock timer - do not touch hands. I'm kidding it
; cFnSB_Speed := 1
; cFnSB_Brake := 2
lFnSB_Speed:
lFnSB_Brake:
  if ((vSpdBrk=cFnSB_Speed) || (vSpdBrk=cFnSB_Brake)) 
      {
        if (fScepl || fUDLR)
            fSpdBrk := true
          else
            fSpdBrk := false

        if ((vSpdBrk=cFnSB_Speed) && (iGear=cMaxGear))
            SetTimer lMoveBrk, off
          else
            SetTimer lMoveBrk, %cTimerBrk%
            
        if ((vSpdBrk=cFnSB_Brake) && (iGear=1))
            SetTimer lMoveUp, off
          else
            SetTimer lMoveUp, %cTimerSpd%
            
        vGearSpdTimer:=vGearSpd//2
        vGearBrkTimer:=vGearBrk//2        
        
        return vRetResult:=fSpdBrk
      }
return vRetFn:=fRetErr
   
;Common subprogramme is not to be verified
; cFnSB_Learn := 0
lFnSB_Learn:
    vGearSpd := (arGear[iGear]+vGearSpd)//2
    vGearBrk := (arGear[iGear]+vGearBrk)//2
    vGearSpdTimer:=vGearSpd//2
    vGearBrkTimer:=vGearBrk//2
    return       
  return vRetFn:=fRetDone

return vRetFn:=fRetErr
      
;While not using - stopgap
; cFnSB_Above := 6
lFnSB_Above: 
return vRetFn:=fRetErr
}
;---End of function fnGearSpdBrk
;---

Просто убери лишнее из функции, отдельного исходника нет - давно дело было.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

10

Re: AHK: Обращение к переменной записанной в переменной

Возможно, не по теме. Запутался в оформлении переменных.
Так я запускаю заданный j-script в консоль Chrome:


var1=
(
$('.toggle-track').each(
    function(counter, song) {
        var temp = document.createElement('a');
        var $song = $(song);
		...
        temp.click();
    } );
)

SendInput ^+{vk4A} ; j - открыть консоль
Sleep 1000
SendRaw % var1 ; вставить j-скрипт
SendInput `n^+{vk4A} ; запустить скрипт и закрыть консоль
return

Необходимо оформить в виде функции, но вместо j-скрипта из переменной отправляется текст в кавычках:


ChromeConsole("var1")

ChromeConsole(script){
	SendInput ^+{vk4A} ; j
	Sleep 1000
	SendRaw % script
	SendInput `n^+{vk4A}
	return
}

Подскажите, пожалуйста, как правильно оформить?

Win10x64, AHK v1.1.25

11 (изменено: stealzy, 2017-09-24 10:22:34)

Re: AHK: Обращение к переменной записанной в переменной

Помогите новичку, у меня скрип не работает:

var1 := 42
MsgBox % "var1"

Вместо переменной выводится текст в кавычках.
Заранее спасибо!

12

Re: AHK: Обращение к переменной записанной в переменной

stealzy, если это ответ, то не ясен, к сожалению.

Win10x64, AHK v1.1.25

13

Re: AHK: Обращение к переменной записанной в переменной

becauseim, что мне нужно исправить, чтобы выводилось содержимое переменной?

14

Re: AHK: Обращение к переменной записанной в переменной

stealzy, Спасибо!

Win10x64, AHK v1.1.25