Switch Case läuft endlos

  • Hallo zusammen,

    hab da mal wieder ein Problem und keine Idee warum das nicht geht. Ich habe ein Switch Case anweisung die wie es scheint in einer endlosschleife läuft und mir ist nicht klar wieso vieleicht sieht ihr den Fehler hier das Script:

    Spoiler anzeigen
    [autoit]


    #Include <Constants.au3>
    #include <Array.au3>
    Opt("TrayMenuMode", 2)
    Opt("TrayAutoPause", 0)
    Global $trayxx[11]
    for $i=0 To UBound($trayxx) -1
    $trayint = RegRead("HKEY_CURRENT_USER\Software\App", "Eintrag"&$i)
    $traytime = RegRead("HKEY_CURRENT_USER\Software\App", "Zeit"&$i)
    if $trayint then
    $trayints = $traytime & " " & $trayint
    else
    $trayints = "Leer"
    endif
    $trayxx[$i] = $trayints
    Next
    _ArraySort($trayxx, 1)
    For $y = 0 To UBound($trayxx) -1
    TrayCreateItem($trayxx[$y])
    Next
    TraySetState()
    While 1
    $msg = TrayGetMsg()
    Switch $msg
    Case $trayxx[0] to UBound($trayxx) -1
    $traytmp = $msg - $trayxx[0] + 1
    $read = RegRead("HKEY_CURRENT_USER\Software\App", "Eintrag"&$traytmp)
    ClipPut($read)
    EndSwitch
    Wend
    Exit

    [/autoit]

    Einmal editiert, zuletzt von DevFly (6. Mai 2010 um 08:35)

  • Ist das dein Ernst? Du hast die Endlosschleife da doch selbst reingeschrieben:

  • Wenn ich das weg lass wird mir ja das Programm gleich beendet macht ja kein sinn. Ist sogar in der Hilfe zu TrayCreateItem in einer Endlosschleife drin. Der Fehler liegt meines erachtens nicht in der While sondern in der Case oder wie wäre deine Lösung?

  • dann mach ganz unten die while schleife hin und schreib nix rein, also:


    [autoit]

    #Include <Constants.au3>
    #include <Array.au3>
    Opt("TrayMenuMode", 2)
    Opt("TrayAutoPause", 0)
    Global $trayxx[11]
    for $i=0 To UBound($trayxx) -1
    $trayint = RegRead("HKEY_CURRENT_USER\Software\App", "Eintrag"&$i)
    $traytime = RegRead("HKEY_CURRENT_USER\Software\App", "Zeit"&$i)
    if $trayint then
    $trayints = $traytime & " " & $trayint
    else
    $trayints = "Leer"
    endif
    $trayxx[$i] = $trayints
    Next
    _ArraySort($trayxx, 1)
    For $y = 0 To UBound($trayxx) -1
    TrayCreateItem($trayxx[$y])
    Next
    TraySetState()
    $msg = TrayGetMsg()
    Switch $msg
    Case $trayxx[0] to UBound($trayxx) -1
    $traytmp = $msg - $trayxx[0] + 1
    $read = RegRead("HKEY_CURRENT_USER\Software\App", "Eintrag"&$traytmp)
    ClipPut($read)
    EndSwitch
    Exit

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(250) ;<= gegen CPu-Überlastung
    WEnd

    [/autoit]
  • na so wird das nicht funktionieren leute..

    die Endlosschleife ist ja dazu da, dass STÄNDIG auf etwas reagiert werden kann (TRAY, GUI, etc)
    was ist so schlimm daran, dass es endlos läuft?! Muss es ja auch..

    ich denk was du brauchst, ist ein Weg um aus der Schleife auszusteigen, da kannst du entweder mit

    [autoit]

    Exit

    [/autoit]

    das ganze Skript beenden oder nur mit

    [autoit]

    ExitLoop

    [/autoit]

    aus der Schleife aussteige, was in deinem Fall auch das ganze Skript beendet, weil nach der Endlosschleife nichts mehr folgt!

    EDIT: Ließ dir mal die Hilfe zu TrayGetMsg und GuiGetMsg durch, dann wirst du verstehen wieso du eine Endlosschleife benötigst.

  • oetzn danke wollt schon meinen kann ja garnicht so falsch sein. Wenn ich dich richtig verstehe bekomme ich 0 zurück und das verursacht das problem ich müsste also drauf achten das kein 0 wert drin ist? Damit dieses funktioniert wahrscheinlich hab ich irgend ein Fehler in der Ausgabe die frage ist nur wo? Mit Exit bzw. ExitLoop steigt er ja komplett aus. Hmmm ich probiere mal noch rum wenn einer eine idee hat wäre ich sehr dankbar dafür.

  • stayawayknight für die Case abfrage nicht die soll halt nur funktionieren wenn ich auf den Eintrag klicke und nicht das er es von allein macht so wie es momentan ist.der Case in der While schleife hat da schon seine richtigkeit wie in den Beispiel aus der Hilfe dort ist ja der Select case auch in einer endlosschleife. Wenn es ausserhalb der While liegt funktioniert es garnicht kannst gern testen. :)

  • stayawayknight für die Case abfrage nicht die soll halt nur funktionieren wenn ich auf den Eintrag klicke und nicht das er es von allein macht so wie es momentan ist.der Case in der While schleife hat da schon seine richtigkeit wie in den Beispiel aus der Hilfe dort ist ja der Select case auch in einer endlosschleife. Wenn es ausserhalb der While liegt funktioniert es garnicht kannst gern testen. :)


    Das ist uns bewusst, aber warum setzt du nicht einfach dass in die While Schleife, was rein soll?

    • Offizieller Beitrag

    Dein Problem ist das Array $trayxx in diesem sind nicht die ControlId´s der TrayItems enthalten sondern der Text des TrayItems.
    So sollte es funktionieren:

    [autoit]

    #include <Constants.au3>
    #include <Array.au3>
    Opt("TrayMenuMode", 2)
    Opt("TrayAutoPause", 0)
    Global $trayxx[11]
    For $i = 0 To UBound($trayxx) - 1
    $trayint = RegRead("HKEY_CURRENT_USER\Software\App", "Eintrag" & $i)
    $traytime = RegRead("HKEY_CURRENT_USER\Software\App", "Zeit" & $i)
    If $trayint Then
    $trayints = $traytime & " " & $trayint
    Else
    $trayints = "Leer"
    EndIf
    $trayxx[$i] = $trayints
    Next
    _ArraySort($trayxx, 1)
    Dim $aControlArray[UBound($trayxx)]; Array für die Aufnahme der ControlId´s der TrayItems

    [/autoit][autoit][/autoit][autoit]

    For $y = 0 To UBound($trayxx) - 1
    $aControlArray[$y] = TrayCreateItem($trayxx[$y])
    Next
    TraySetState()

    [/autoit][autoit][/autoit][autoit]

    While 1; Hier ist die Hauptschleife des Programms und in dieser werden auch die TrayMessages abgefragt.
    $msg = TrayGetMsg()
    Switch $msg
    Case $aControlArray[0] To $aControlArray[UBound($aControlArray) - 1]
    $traytmp = $msg - $aControlArray[0] ; Hier war ein Fehler , warum -1 ? Du geginnst doch bei deiner RegKey Abfrage bei 0 und nicht bei 1.
    $read = RegRead("HKEY_CURRENT_USER\Software\App", "Eintrag" & $traytmp)
    ClipPut($read)
    EndSwitch
    Sleep(250) ;<= gegen CPu-Überlastung
    WEnd

    [/autoit]