autohotkey gui in loop

时间:2018-06-06 18:14:07

标签: loops user-interface autohotkey

所以......我已经有一段时间了,但我肯定还是很可怕。

总结:

我想在点击某些guis中的特定选项后开始循环的下一次迭代。

在我的研究中,我发现你不能在循环中获得任何回报。问题是我不知道如何在没有回报的情况下完成这项工作。

请帮助!

谢谢,

Marc S

(TRIMMED!)

`                     起始线:= 5

                Loop, 10
            {
                         CurrentRow := (StartLine - 1) + A_Index ;*****

                        ;----------------***GETTING THE DATA***----------------
                        ControlFocus,, Proto_Names - Excel 
                        Sleep, 200
                        oNamesDoc := ComObjActive("Excel.Application")
                        Global AlertStatus := oNamesDoc.Range("C" CurrentRow).Text
                        Global AlertQualifier := oNamesDoc.Range("D" CurrentRow).text
                        Global First := oNamesDoc.Range("H" CurrentRow).text
                        Global Last := oNamesDoc.Range("I" CurrentRow).text
                        Global State := oNamesDoc.Range("J" CurrentRow).text
                        Global Type := oNamesDoc.Range("M" CurrentRow).text
                        Global HMSStatus := oNamesDoc.Range("P" CurrentRow).text
                        Global HMSQualifier := oNamesDoc.Range("Q" CurrentRow).text
                        Global LicenseNo := oNamesDoc.Range("N" CurrentRow).text
                        Global Scrubbed := oNamesDoc.Range("AB" CurrentRow).value
                        ;----------------***GETTING THE DATA***----------------

            ;Gui
                            Gui, 2:Add, Text,x1 y8, Blah Blah
                            Gui, 2:Add, Button, x1 y40, License
                            Gui, 2:Add, Button, x80 y40, Name 
                            Gui, 2:Show, , blah blah - Row %CurrentRow% ; Important because it references A_Index
                        return

                                2GuiClose:    
                                    Gui, 2:Destroy  
                                return        

                                2ButtonLicense:
                                    Gui, 2:Submit 
                                    Gui, 2:Destroy  
            ;Another GUI
                                        Gui, 3:Add, Text,x1 y8, Text
                                        Gui, 3:Add, Text,x170 y132, Row %CurrentRow%  ;Important because it references A_index
                                        Gui, 3:Add, Button,x1 y125 , blah
                                        Gui, 3:Show, , blah blah

                                        return

                                            3GuiClose:     
                                                Gui, 3:Destroy  
                                            return        

                                            3ButtonAgree:
                                                Gui, 3:Submit  
                                                Gui, 3:Destroy  
                                                MsgBox, Click OK for Next
                                            continue 
            } 

`

进一步总结:

目标: 循环以下内容: 1. Gui#1:选项a |选项b 也想显示A_Index

如果选择了选项A或B,请转到Gui#2

  1. Gui#2:选项c |选项d 也想显示A_Index
  2. 如果选项c,从gui 1开始下一次循环迭代。

    如果选项d,请转到Gui#3

    1. Gui#3:复选框E | F | G | H
    2. 如果选择了任何选项,我想更新一个xslx文件(我可以计算出该部分),然后开始循环的下一次迭代。

2 个答案:

答案 0 :(得分:0)

The documentation for Loop建议您可以使用break提前退出循环。这是你想要通过回报实现的目标吗? 你可以设置一个返回变量,中断并返回那个?

澄清后编辑:

我认为最好的方法是将每个gui作为一个函数分开,只运行你在这里使用的循环。

有一个主循环和一个全局变量,说明要输入的下一个循环是什么 然后每个函数都可以设置这个变量。

global NextLoop:=1
main(){
    global NextLoop
    loop{
        if NextLoop == 1 {
            gui1()
        }else if NextLoop == 2 {
            gui2()
        } ; etc...
    }
}
gui1(){
    global NextLoop
    loop{
        if ; user chooses an option {
            NextLoop := 2
            return
        }
    }
} 
gui2(){
    global NextLoop
    loop{
        if ; user chooses c {
            NextLoop := 1
            return
        }

        if ; user chooses d {
            NextLoop := 3
            return
        }
    }
}

} 

填写该代码,它应该有效。

答案 1 :(得分:0)

感谢您的建议,但我想我已经弄清楚了。看看下面的代码,我会尝试回答任何问题。它真漂亮......

LoopTot := (Endline - StartLine) + 1 

Loop, %LoopTot% ;***Starts the loop***
{ 

Global CurrentRow := (StartLine - 1) + A_Index

;----------------***GETTING THE DATA***----------------
ControlFocus,, Proto_Names - Excel 
Sleep, 200
oNamesDoc := ComObjActive("Excel.Application")
Global AlertStatus := oNamesDoc.Range("C" CurrentRow).Text
Global AlertQualifier := oNamesDoc.Range("D" CurrentRow).text
Global First := oNamesDoc.Range("H" CurrentRow).text
Global Last := oNamesDoc.Range("I" CurrentRow).text
Global State := oNamesDoc.Range("J" CurrentRow).text
Global Type := oNamesDoc.Range("M" CurrentRow).text
Global HMSStatus := oNamesDoc.Range("P" CurrentRow).text
Global HMSQualifier := oNamesDoc.Range("Q" CurrentRow).text
Global LicenseNo := oNamesDoc.Range("N" CurrentRow).text
Global Scrubbed := oNamesDoc.Range("AB" CurrentRow).value
;----------------***GETTING THE DATA***----------------

    Gui, 2:font, s12, Verdana
    Gui, 2:Add, Text,x1 y8, %First% %Last% License:%LicenseNo%
    Gui, 2:Add, Button, x1 y40, License
    Gui, 2:Add, Button, x80 y40, Name 
    Gui, 2:Show, , Search Options - Row %CurrentRow%

  WinWaitClose, Search Options - Row %CurrentRow% 

  If Var = 1

    Continue 

  If Var = 2

    Continue

} 

msgbox DONE!
ExitApp 



2ButtonLicense: 

    Var = 1

    Gui,  2:Destroy 

    CALicense1()

    LicenseAgreeDisagree()

return
return



  2ButtonName:

        Var = 2

        Gui,  2:Destroy 

    CAName1()

    NameAgreeDisagree()

return 
return