带有子程序和功能的控制流程问题

时间:2015-05-01 12:07:23

标签: autohotkey

我在尝试让函数返回到调用它的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}

    * /

1 个答案:

答案 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}

*/