我在AutoHotkey中编写一个简单的GUI,其中一个元素是能够将数字与按钮标签相关联:
Call:
{
book := {"Tel Maison": 8912, "Tel Mobile": 000000}
nr := book[%A_GuiControl%]
MsgBox %A_GuiControl% - number: %nr%
}
CapsLock::
Gui, Add, Button, gCall, Tel Maison
Gui, Add, Button, gCall, Tel Mobile
Gui, Show
运行此脚本时,按下按钮后会出现一条错误消息(以下变量名称包含非法字符:“Tel Maison”)指向
nr := book[%A_GuiControl%]
我认为这是由于标签名称中的空格字符。
Q1:是否可以使用带空格的哈希键?
我将脚本修改为
Call:
{
book := {"TelMaison": 8912, "TelMobile": 000000}
nr := book[%A_GuiControl%]
MsgBox %A_GuiControl% - number: %nr%
}
CapsLock::
Gui, Add, Button, gCall, TelMaison
Gui, Add, Button, gCall, TelMobile
Gui, Show
它现在运行但变量nr
为空。
Q2:标签通过A_GuiControl
作为字符串传递,对吧?如果是这样,为什么上面示例中的密钥不匹配?
我也尝试使用book := {TelMaison: 8912, TelMobile: 000000}
,但结果是相同的
答案 0 :(得分:4)
这是AHK中表达式与字符串文字的典型示例,在某些情况下这可能很麻烦。为了将变量内容用作对象的键,只需将变量放在括号中,然后不要将它们用百分号(%
)包围:
nr := book[A_GuiControl]
这样,您可以很好地使用空格作为按钮名称。
book[%A_GuiControl%]
的问题是什么?
当您按键访问对象属性时,AHK需要硬编码字符串(例如book["Tel Maison"]
)或变量。由于我们不会将其传递给硬字符串,因此假设TelMaison
或Tel Maison
是变量名称。访问Tel Maison
将直接导致运行时错误,因为变量名称不能包含空格。 TelMaison
是合法的,但不包含任何内容。基本上,我们使用空字符串作为键来访问对象(如book[""]
)。顺便说一下,这不是非法的,你实际上可以使用空字符串作为键,尽管我认为在大多数情况下这是不合理的。
为什么AHK会提供这种奇怪的语法?
在某些情况下,您可能希望将变量的内容依次用作变量名称。例如,请查看此示例:
TelMaison := 8912
TelMobile := 0
Gui, Add, Button, gCall, TelMaison
Gui, Add, Button, gCall, TelMobile
Gui, Show
Exit
Call:
nr := %A_GuiControl%
msgbox % nr
return
使用nr := %A_GuiControl%
,nr
被赋予变量的值,其名称等于A_GuiControl
的内容。我不会推荐这种模式,因为它非常容易出错并且设计很糟糕。