子程序和函数的控制流问题

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.

第三,您不需要 {},因为您在 CancelContinue 标签的开头使用它们:仅在函数中使用它们!! (或 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}

*/