Schleife bei Select/Case?

  • hallo!

    ich habe ein blödes problem, ich komme einfach nicht weiter :(

    also: ich erzeuge mit folgendem code zu beginn des scriptes 50 buttons (25 in der ersten reihe, 25 in der reihe darunter)

    [autoit]

    $x = 14
    $y = 24
    For $i = 1 to 9 Step +1
    $buttonsArray[$i] = GUICtrlCreateButton(" " & $i & " ",$x,$y)
    $x = $x + 20;
    Next
    For $i = 10 to 26 Step +1
    $buttonsArray[$i] = GUICtrlCreateButton(" " & $i & " ",$x,$y)
    $x = $x + 26;
    Next
    $x = 14
    $y = 54
    For $i = 27 to 50 Step +1
    $buttonsArray[$i] = GUICtrlCreateButton(" " & $i & " ",$x,$y)
    $x = $x + 26;
    Next

    [/autoit]

    das funktioniert auch. nun ist das problem aber, wenn ich mit der while-schleife, die button-klicks usw. abfragt, arbeiten will:

    [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $buttonsArray[1]
    ; tue irgendwas...
    Case $msg = $buttonsArray[2]
    ; tue irgendwas...
    Case $msg = $buttonsArray[3]
    ; tue irgendwas...
    ; USW.
    EndSelect
    WEnd

    [/autoit]

    jeden einzelnen index dort manuell abzufragen ist einfach bei 50 buttons richtig blöde und langwierige arbeit (und wahrscheinlich auch unnötig)
    ich habe schon versucht da irgendwie wie beim erstellen der buttons eine schleife zu machen, aber das funktioniert nicht

    bitte helft mir
    danke im voraus!!

    Einmal editiert, zuletzt von pete_gzome (22. September 2009 um 15:55)

  • danke für die schnelle antwort

    ich bekomme aber leider die folgende fehlermeldung:

    Zitat

    Array variable has incorrect number of subscripts or subscript dimension range exceeded.

    und zwar in zeile 7 deines quellcodes

  • Bin mir nicht sicher und habe leider kein Autoit drauf.
    Aber Probier es mal mit Ubound -1

    [autoit]

    $Ubound = UBound($buttonsArray) -1

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

    While 1
    $msg = GUIGetMsg()
    For $i = 1 To $Ubound
    Switch $msg
    Case $buttonsArray[$i]
    MsgBox(0, "", "Button: " & $buttonsArray[$i] & " wurde angeklickt.")
    EndSwitch
    Next
    WEnd

    [/autoit]
  • ok danke, mit -1 kommt schon mal keine fehlermeldung mehr

    jedoch sind die zahlen verschoben^^

    wenn ich button 1 klicke, wird angezeigt "button 4 wurde geklickt"
    usw.
    wenn ich button 50 klicke, wird angezeigt "button 53 wurde geklickt"

  • [autoit]

    While 1
    For $i = 1 To UBound($buttonsArray) -1
    Switch GUIGetMsg()
    Case $buttonsArray[$i]
    MsgBox(0, "", "Button: " & $buttonsArray[$i] & " wurde angeklickt.")
    EndSwitch
    Next
    WEnd

    [/autoit]

    So sollte es gehn :)

    Klar: Die Zahl die du dort siehst ist die CTRLID des Buttons. Das ist so schon richtig.
    Was möchtest du denn so auf die 50 buttons legen?
    Vielleicht kann man das alles auch anders lösen?

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 600, -1, -1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    dim $buttonsArray[51]

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

    $x = 14
    $y = 24
    For $i = 1 to 9 Step +1
    $buttonsArray[$i] = GUICtrlCreateButton(" " & $i & " ",$x,$y)
    $x = $x + 20;
    Next
    For $i = 10 to 26 Step +1
    $buttonsArray[$i] = GUICtrlCreateButton(" " & $i & " ",$x,$y)
    $x = $x + 26;
    Next
    $x = 14
    $y = 54
    For $i = 27 to 50 Step +1
    $buttonsArray[$i] = GUICtrlCreateButton(" " & $i & " ",$x,$y)
    $x = $x + 26;
    Next

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $buttonsArray[1] to UBound($buttonsArray)+1
    MsgBox(1, "", "Hallo")

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

    EndSwitch
    WEnd

    [/autoit]


    Ist aber doch blöd, schließlich hat dann jeder Button die gleiche Funktion. :wacko:

  • Zitat

    Klar: Die Zahl die du dort siehst ist die CTRLID des Buttons. Das ist so schon richtig.
    Was möchtest du denn so auf die 50 buttons legen?
    Vielleicht kann man das alles auch anders lösen?

    hm ja also ich möchte für mich selbst so ein kleines script machen, das, wenn ich strg+c drücke, also irgendeinen text kopiere, der zwischengespeichert wird, damit der nicht überschrieben wird, wenn ich etwas anderes kopiere

    und dann später will ich per buttons die verschiedenen clipboard inhalte abfragen können bzw. die gespeicherten texte aufrufen

    nur bin ich ein ziemlicher anfänger und kriegs nicht hin :/

  • Der variable Funktionsaufruf läßt sich z.B. mit Call lösen z.B.:

    [autoit]

    Call("Funktion" & $i)

    [/autoit]

    Das Dings:

    [autoit]

    Switch GUIGetMsg()
    Case $buttonsArray[$i]
    MsgBox(0, "", "Button: " & $buttonsArray[$i] & " wurde angeklickt.")
    EndSwitch

    [/autoit]


    ist einfach formuliert:

    [autoit]

    If GUIGetMsg() = $buttonsArray[$i] Then MsgBox(0, "", "Button: " & $buttonsArray[$i] & " wurde angeklickt.")

    [/autoit]

    dann könnte man z.B. das machen:

    [autoit]

    While 1
    For $i = 1 To UBound($buttonsArray) -1
    If GUIGetMsg() = $buttonsArray[$i] Then Call("Funktion" & $i) ; ruft" Funktion1()" auf
    Next
    WEnd

    [/autoit]
  • Die Zahlen sind aber wegen was anderem verrutscht !
    Das erste Element in einem Array ist [0]

    Wie wollt ihr das abfragen wenn $i = 1 und Step =+1 ist? :rolleyes:

    [autoit]

    While 1
    For $i = 0 To UBound($buttonsArray) -1
    Switch GUIGetMsg()
    Case $buttonsArray[$i]
    MsgBox(0, "", "Button: " & $buttonsArray[$i] & " wurde angeklickt.")
    EndSwitch
    Next
    WEnd

    [/autoit]
  • @Stilgar

    hm das funktioniert nicht :(
    wenn ich irgendeinen button klicke, passiert nichts, außer dass mein lüfter extrem laut wird

    ich habe noch mal dies hier probiert:

    [autoit]

    $msg = GUIGetMsg()
    While 1
    Select
    For $i = 1 To UBound($buttonsArray) -1
    Case $msg = $buttonsArray[$i]
    Call("funktion" & $i)
    Next

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

    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop

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

    EndSelect
    WEnd

    [/autoit]

    geht leider auch nicht

    Zitat

    Case" statement with no matching "Select"or "Switch" statement.:
    Case $msg = $buttonsArray[$i]


    @eF_Hacks

    das geht auch nicht... beim klick passiert nichts

    und wenn ich die 0 mit der 1 austausche, werden ohne dass ich buttons anklicke die message boxes alle hintereinander angezeigt, aber nur
    "button wurde angeklickt", also keine nummer


    ich werde erst mal ein bisschen pause machen, um den kopf frei zu bekommen :)

    Einmal editiert, zuletzt von pete_gzome (22. September 2009 um 15:30)

  • ok, also ich hab es jetzt so gemacht:

    [autoit]

    While 1
    $msg = GUIGetMsg()
    For $i = 1 To UBound($buttonsArray) -1
    Switch $msg
    Case $buttonsArray[$i]
    MsgBox(0, "", "Button: " & $buttonsArray[$i]-3 & " wurde angeklickt.")
    EndSwitch
    Next
    WEnd

    [/autoit]

    jetzt habe ich nur noch ein kleines problem:
    wie krieg ich da das

    [autoit]

    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop

    [/autoit]


    rein?

  • Hi,

    [autoit]

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    For $i = 1 To UBound($buttonsArray) -1
    Switch $msg
    Case $buttonsArray[$i]
    MsgBox(0, "", "Button: " & $buttonsArray[$i]-3 & " wurde angeklickt.")
    EndSwitch
    Next
    WEnd

    [/autoit]
  • Ich weiß nicht was daran so schwer ist, aber das hier geht auf jeden Fall !!

    [autoit]

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

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

    ;Create Gui
    $Example = GUICreate("Example", 625, 445, 193, 125)
    GUISetState()

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

    ;Define Array
    Dim $Buttons[13]

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

    ;Get Array Size
    $iUbound = UBound($Buttons)

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

    ;define Y
    $y = 8

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

    ;Start Creating the Buttons
    For $i = 0 To $iUbound - 1
    $Buttons[$i] = GUICtrlCreateButton("Button " & $i + 1, 8, $y, 75, 25, 0)
    $y += 32
    Next

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

    While 1
    $nMsg = GUIGetMsg()
    For $a = 0 To $iUbound -1
    If $nMsg = $Buttons[$a] Then MsgBox(0x40, "Button", "Button #" & $a + 1 & " wurde gedrückt!")
    Next
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]
  • Die Zahlen sind aber wegen was anderem verrutscht !
    Das erste Element in einem Array ist [0]

    Wie wollt ihr das abfragen wenn $i = 1 und Step =+1 ist?


    Gar nicht.
    Der Anfang bei 1 resultierte aus dem Beispiel im ersten Beitrag:

    [autoit]

    For $i = 1 to 9 Step +1
    $buttonsArray[$i] = GUICtrlCreateButton(" " & $i & " ",$x,$y)

    [/autoit]

    @pete_gzome:
    Dieses Switch mit nur einem Case ist das gleiche wie If ... Then, siehe Beispiel:
    [ gelöst ] Schleife bei Select/Case?
    nur extrem umständlicher.