我在尝试让函数返回到调用它的if
语句时遇到问题。无论我使用return
还是exit
,它都会完全忽略该语句并继续执行脚本的其余部分,即使它被注释掉了。
我希望这个工作非常简单,有几个if
语句,一个函数列表和一个脚本的重新加载。这是我到目前为止所做的事情:
#NoEnv
SetWorkingDir %A_ScriptDir%
^!r::Reload
global
ifNotExist timeclock.ini
FileAppend,, timeclock.ini
IniRead, 4_Days, timeclock.ini, MAIN, 4_Days, 0
IniRead, 5_Days, timeclock.ini, MAIN, 5_Days, 0
IniRead, In, timeclock.ini, MAIN, In, 0
IniRead, Out, timeclock.ini, MAIN, Out, 0
IniRead, DSP, timeclock.ini, MAIN, DSP, 0
!\::
Gui, Show, W280 H150 Center, Schedule
Gui, Add, Radio, Checked%4_Days% v4_Days, 4 Days
Gui, Add, Radio, Checked%5_Days% v5_Days, 5 Days
Gui, Add, Button, y+40 gCancel, Cancel
Gui, Add, Text, ym, Time in:
Gui, Add, Edit, w50 Number vIn, %In%
Gui, Add, Text,, Time out:
Gui, Add, Edit, w50 Number vOut, %Out%
Gui, Add, Button, Default gContinue, OK
return
Cancel:
{
Gui, Destroy
return
}
Continue:
{
Gui, Submit
}
DSPA:=0
DSPB:=0
if (In = 2130) {
DSPA:=2
DSPB:=8
DSP=10
}
if (In = 2300) {
DSPA:=0.5
DSPB:=7.5
DSP=8
}
IniWrite, %4_Days%, timeclock.ini, MAIN, 4_Days
IniWrite, %5_Days%, timeclock.ini, MAIN, 5_Days
IniWrite, %In%, timeclock.ini, MAIN, In
IniWrite, %Out%, timeclock.ini, MAIN, Out
IniWrite, %DSP%, timeclock.ini, MAIN, DSP
If (4_Days = 1) {
sub_DSP(DSPA)
reload
}
sub_DSP(x)
{
send {tab 4}
loop, 5 {
send D
sleep 1000
}
send {tab}
sleep 250
send x
sleep 300
loop, 8 {
send +{tab}
sleep 300
}
sleep 300
send {enter}
sleep 300
send {tab 2}
sleep 300
return
}
/*
send %in%
sleep 300
send {tab 3}
sleep 300
send 2330
sleep 300
Loop, 32 {
send {tab}
sleep 100
}
middleDay:
send {tab 4}
loop, 5 {
send D
sleep 1000
}
send {tab}
* /
答案 0 :(得分:0)
首先,任何return
关键字后的所有指令都不会被执行。 ^!r::Reload
是
^!r::
reload
return
因此,inireads将永远不会执行。
其次,您不止一次执行gui, add, ...
命令。您可能只想将它们放入自动执行块(之前热键/标签),并且只在Gui, Show, ...
热键中包含!\::
。然后,如果您使用Gui, Hide
而不是Gui, Destroy
,则gui将不会完全消失,并且在重新打开(在同一会话中)后,您所做的元素的任何更改都不会丢失,即使没有iniwrites。
第三,当您在{}
或Cancel
标签的开头使用Continue
时,您不需要Continue
:仅在功能中使用它们!! (或if语句,循环,等等)
第四,您忘记将return
标签与global
括起来。这可能并且可能会导致严重的错误。
五,您不需要在函数外部使用关键字sub_DSP
。您只定义了一个名为4_Days
的函数,在其中,您不会访问任何全局变量,如sub_DSP(x) {}
。
您的函数return
看起来不错,除非您不在函数中需要return x
关键字,除非您想要返回一个值(例如{ {1}},所以你可以这样称呼它:myVar := sub_DSP("hi")
)或早先终止。
您的新代码可能如下所示:(但我建议您自己手动修改代码)
#NoEnv
SetWorkingDir %A_ScriptDir%
ifNotExist timeclock.ini
FileAppend,, timeclock.ini
IniRead, 4_Days, timeclock.ini, MAIN, 4_Days, 0
IniRead, 5_Days, timeclock.ini, MAIN, 5_Days, 0
IniRead, In, timeclock.ini, MAIN, In, 0
IniRead, Out, timeclock.ini, MAIN, Out, 0
IniRead, DSP, timeclock.ini, MAIN, DSP, 0
Gui, Add, Radio, Checked%4_Days% v4_Days, 4 Days
Gui, Add, Radio, Checked%5_Days% v5_Days, 5 Days
Gui, Add, Button, y+40 gCancel, Cancel
Gui, Add, Text, ym, Time in:
Gui, Add, Edit, w50 Number vIn, %In%
Gui, Add, Text,, Time out:
Gui, Add, Edit, w50 Number vOut, %Out%
Gui, Add, Button, Default gContinue, OK
return
^!r::Reload
!\::
Gui, Show, W280 H150 Center, Schedule
return
Cancel:
GuiClose: ; standard behaviour of GuiClose is: gui, destroy
Gui, Hide
return
Continue:
Gui, Submit
DSPA:=0
DSPB:=0
if (In = 2130) {
DSPA:=2
DSPB:=8
DSP=10
}
if (In = 2300) {
DSPA:=0.5
DSPB:=7.5
DSP=8
}
IniWrite, %4_Days%, timeclock.ini, MAIN, 4_Days
IniWrite, %5_Days%, timeclock.ini, MAIN, 5_Days
IniWrite, %In%, timeclock.ini, MAIN, In
IniWrite, %Out%, timeclock.ini, MAIN, Out
IniWrite, %DSP%, timeclock.ini, MAIN, DSP
If (4_Days = 1) {
sub_DSP(DSPA)
reload
}
return
sub_DSP(x)
{
send {tab 4}
loop, 5 {
send D
sleep 1000
}
send {tab}
sleep 250
send x
sleep 300
loop, 8 {
send +{tab}
sleep 300
}
sleep 300
send {enter}
sleep 300
send {tab 2}
sleep 300
}
/*
send %in%
sleep 300
send {tab 3}
sleep 300
send 2330
sleep 300
Loop, 32 {
send {tab}
sleep 100
}
middleDay:
send {tab 4}
loop, 5 {
send D
sleep 1000
}
send {tab}
*/