Case in For Schleife

  • Ich habe ein Problem ^^
    Ich versuche in meinem Skript "Case" in einer For Schleife zu verwenden.
    Hoffe ihr könnt helfen. Hier mein Skript.

    [autoit]


    #RequireAdmin
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    $WindowSizeHeight = IniRead(@ScriptDir & "\config\applications.ini", "General", "AppsInstalled", "0") + 1
    $forOther = $WindowSizeHeight*46
    $WindowSizeHeightB = $WindowSizeHeight*46+167
    $WindowSizeHeight = $WindowSizeHeightB-2*46

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

    $guiBASE = GUICreate("NosTools v0.1 Beta", 261, $WindowSizeHeight, 290, 141)
    $picHeader = GUICtrlCreatePic("C:\Users\Bono\Desktop\test.jpg", 0, 0, 260, 41, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $lblInstalled = GUICtrlCreateLabel("Installierte Tools", 80, 48, 98, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x0000FF)

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

    $Count = IniRead(@ScriptDir & "\config\applications.ini", "General", "AppsInstalled", "")
    Local $i = 0
    For $i = 1 To $Count
    $b = $i+1
    $c=$b
    $highMAL = $i*46
    $high = $highMAL+80-46
    Assign($i, GUICtrlCreateButton(IniRead(@ScriptDir & "\config\applications.ini", $i, "Text", ""), 16, $high, 225, 41))
    Next

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

    $lblStrich = GUICtrlCreateLabel("--------------------------------------------------------------------------", 16, 128+$forOther-92, 226, 17)
    $lblCopyright = GUICtrlCreateLabel("Copyright 2010", 88, 144+$forOther-92, 75, 17)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    For $o = 1 To $Count
    Switch $nMsg
    Case $o
    $openEXE = IniRead(@ScriptDir & "\config\applications.ini", $o, "Open", "")
    ShellExecute(@ScriptDir & $openEXE)
    EndSwitch
    Next

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

    EndSwitch
    WEnd

    [/autoit]


    Und hier meine applications.ini:

    [autoit]


    [General]
    AppsInstalled=4
    [1]
    Text=Test
    Open=\Apps\Programm.exe
    [2]
    Text=Test2
    [3]
    Text=Test3
    [4]
    Text=Test4

    [/autoit]


    Danke :O

    2 Mal editiert, zuletzt von DarkKira (29. Oktober 2010 um 01:41) aus folgendem Grund: Richtig formatiert ;)

  • Hi,

    Die While-Schleife
    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    For $o = 1 To $Count
    Switch $nMsg
    Case $o
    $openEXE = IniRead(@ScriptDir & "\config\applications.ini", $o, "Open", "")
    ShellExecute(@ScriptDir & $openEXE)
    EndSwitch
    Next
    EndSwitch
    WEnd

    [/autoit]

    Das kann ja nix werden, da vor der

    [autoit]

    For;-Schleife

    [/autoit]

    ein

    [autoit]

    Exit

    [/autoit]

    steht. 8|

    Selbst wenn das Exit da nicht wäre, würde die

    [autoit]

    For;-Schleife

    [/autoit]

    auch nur dann ausgeführt werden, wenn jemand die GUI

    [autoit]

    $GUI_EVENT_CLOSE

    [/autoit]

    schließt. Macht auch keinen Sinn :P


    Nein, was du brauchst ist ein anderer

    [autoit]

    Case;-Zweig

    [/autoit]

    , aber mit ohne Bedingung ;)
    Probiers mal so:

    Zeile 6
    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case Else
    For $o = 1 To $Count
    Switch $nMsg
    Case $o
    $openEXE = IniRead(@ScriptDir & "\config\applications.ini", $o, "Open", "")
    ShellExecute(@ScriptDir & $openEXE)
    EndSwitch
    Next
    EndSwitch
    WEnd

    [/autoit]
    Hint

    Ein kleiner Hinweis:
    Mit

    [autoit]

    Case $o

    [/autoit]

    wirst du Probleme bekommen. Warum?
    Das kriegst du bestimmt selber raus :thumbup:
    Wenn nicht, kannst ja hier nochmal nachfragen. :rock:

  • ahh jetzt verstehe ich^^ Und das mit dem $o kann nicht funktionieren weil der Button gar nicht auf die Variable zugewiesen ist :D
    Aber wie kriege ich das jetzt hin? ?(

  • Du erzeugst ja hier zur Laufzeit Variablen

    [autoit]

    Assign($i, GUICtrlCreateButton(IniRead(@ScriptDir & "\config\applications.ini", $i, "Text", ""), 16, $high, 225, 41))

    [/autoit]


    Aus den Zahlen 1, 2, 3, ... erzeugst du die Variablen $1, $2, $3, ...

    um diese Variablen abzufragen, benutzt du einfach die Funktion

    [autoit]

    Eval($i)

    [/autoit]


    Mit den Zahlen 1, 2, 3, ... greifst du dann auf die Variablen $1, $2, $3, ... zu

    Zitat von Aus der Autoit 3 Hilfe


    Remarks
    If there is a need to use Assign() to create/write to a
    variable, then in most situations, Eval() should be used to read the variable


    ;)

    Statt

    [autoit]

    Case $o

    [/autoit]


    schreibst du also

    [autoit]

    Case Eval($o)

    [/autoit]


    ^^

  • Mein Vorschlag wäre dieser hier:

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Global $sFilePathIni = @ScriptDir & "\config\applications.ini"
    Global $iHeight = IniRead($sFilePathIni, "General", "AppsInstalled", "0") + 1
    Global $iForOther = $iHeight * 46
    Global $iHeightB = $iHeight * 46 + 167
    $iHeight = $iHeightB - 2 * 46
    Global $aButton[1] = [-1]

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

    $hGui = GUICreate("NosTools v0.1 Beta", 261, $iHeight, 290, 141)
    $hHeaderPic = GUICtrlCreatePic("C:\Users\Bono\Desktop\test.jpg", 0, 0, 260, 41, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUICtrlCreateLabel("Installierte Tools", 80, 48, 98, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x0000FF)
    If IniRead($sFilePathIni, "General", "AppsInstalled", "0") <> 0 Then
    ReDim $aButton[IniRead($sFilePathIni, "General", "AppsInstalled", "0")]
    For $i = 0 To UBound($aButton) - 1
    $high = (($i + 1) * 46) + 80 - 46
    $aButton[$i] = GUICtrlCreateButton(IniRead($sFilePathIni, $i + 1, "Text", ""), 16, $high, 225, 41)
    Next
    EndIf
    GUICtrlCreateLabel("--------------------------------------------------------------------------", 16, 128 + $iForOther - 92, 226, 17)
    GUICtrlCreateLabel("Copyright 2010", 88, 144 + $iForOther - 92, 75, 17)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case Else
    For $i = 0 To UBound($aButton) - 1
    If $nMsg = $aButton[$i] Then ShellExecute(@ScriptDir & IniRead($sFilePathIni, $i + 1, "Open", ""))
    Next
    EndSwitch
    WEnd

    [/autoit]


    Dein hin und her gerechne, würde ich aber an deiner Stelle verringern. Das geht auch einfacher. Und solange du Labels zur Laufzeit nicht änderst, brauchst denen auch keine Variable geben. Zu viele Variablen erhöhen nur die Codelänge und Unlesbarkeit, warum sollte man sich Variablennamen merken, wenn man sie später garnicht braucht.