子程序和函数的控制流问题
Problems with control flow with subroutines and functions
我在尝试将 return 的函数返回到调用它的 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}
*/
首先,所有在之后的指令,任何return
关键字都不会被执行。 ^!r::Reload
是
的缩写形式
^!r::
reload
return
因此,inireads 将永远不会被执行。
其次,您不止一次地执行了 gui, add, ...
命令。您可能只想将它们放入自动执行块( 在 热键/标签之前)并且只在 !\::
热键中包含 Gui, Show, ...
。然后,如果您使用 Gui, Hide
而不是 Gui, Destroy
,gui 将不会完全消失,并且您对元素所做的任何更改在重新打开(在同一会话中)后都不会丢失,即使没有iniwrites.
第三,您不需要 {}
,因为您在 Cancel
或 Continue
标签的开头使用它们:仅在函数中使用它们!! (或 if 语句、循环等)
第四,您忘记用 return
括起 Continue
标签。这可能而且很可能会导致严重的错误。
第五,您不一定需要在函数外部使用关键字 global
。您只定义了一个名为 sub_DSP
的函数,并且在其中,您没有访问任何全局变量,例如 4_Days
.
你的函数 sub_DSP(x) {}
我觉得不错,除了你 不需要 函数中需要 return
关键字,除非你想 return 一个值(例如 return x
,因此您可以这样称呼它: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}
*/
我在尝试将 return 的函数返回到调用它的 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}
*/
首先,所有在之后的指令,任何return
关键字都不会被执行。 ^!r::Reload
是
^!r::
reload
return
因此,inireads 将永远不会被执行。
其次,您不止一次地执行了 gui, add, ...
命令。您可能只想将它们放入自动执行块( 在 热键/标签之前)并且只在 !\::
热键中包含 Gui, Show, ...
。然后,如果您使用 Gui, Hide
而不是 Gui, Destroy
,gui 将不会完全消失,并且您对元素所做的任何更改在重新打开(在同一会话中)后都不会丢失,即使没有iniwrites.
第三,您不需要 {}
,因为您在 Cancel
或 Continue
标签的开头使用它们:仅在函数中使用它们!! (或 if 语句、循环等)
第四,您忘记用 return
括起 Continue
标签。这可能而且很可能会导致严重的错误。
第五,您不一定需要在函数外部使用关键字 global
。您只定义了一个名为 sub_DSP
的函数,并且在其中,您没有访问任何全局变量,例如 4_Days
.
你的函数 sub_DSP(x) {}
我觉得不错,除了你 不需要 函数中需要 return
关键字,除非你想 return 一个值(例如 return x
,因此您可以这样称呼它: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}
*/