Frage zu Buttonabfrage mit Array...

  • Tach zusamm.
    Hab hier grad en Script, das zwar so schon gut is, aber noch zu kürzen geht.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <String.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("", 609, 182, -1, -1)
    GUISetBkColor(0x00FF00)
    Dim $Button[12]
    $Button[0] = GUICtrlCreateButton("", 10, 10, 140, 40, 0)
    $Button[1] = GUICtrlCreateButton("", 160, 10, 140, 40, 0)
    $Button[2] = GUICtrlCreateButton("", 310, 10, 140, 40, 0)
    $Button[3] = GUICtrlCreateButton("", 460, 10, 140, 40, 0)
    $Button[4] = GUICtrlCreateButton("", 10, 60, 140, 40, 0)
    $Button[5] = GUICtrlCreateButton("", 160, 60, 140, 40, 0)
    $Button[6] = GUICtrlCreateButton("", 310, 60, 140, 40, 0)
    $Button[7] = GUICtrlCreateButton("", 460, 60, 140, 40, 0)
    $Button[8] = GUICtrlCreateButton("", 10, 110, 140, 40, 0)
    $Button[9] = GUICtrlCreateButton("", 160, 110, 140, 40, 0)
    $Button[10] = GUICtrlCreateButton("", 310, 110, 140, 40, 0)
    $Button[11] = GUICtrlCreateButton("", 460, 110, 140, 40, 0)
    $Menu1 = GUICtrlCreateMenu ("Datei")
    $Menu1Item1 = GUICtrlCreateMenuItem ("Datei zum abspielen auswählen", $Menu1)
    $Menu1Item2 = GUICtrlCreateMenuItem ("", $Menu1)
    $Menu1Item3 = GUICtrlCreateMenuItem ("Beenden", $Menu1)
    $Menu2 = GUICTrlCreateMenu ("Hilfe")
    $Menu2Item1 = GUICtrlCreateMenuItem ("Über", $Menu2)
    $Menu2Item2 = GUICtrlCreateMenuItem ("", $Menu2)
    $Menu2Item3 = GUICtrlCreateMenuItem ("Hilfe", $Menu2)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    ; --------
    If Not FileExists (@ScriptDir & "\Save.ini") Then
    For $i = 0 To 11 Step 1
    IniWrite (@ScriptDir & "\Save.ini", "Angelegte Dateien", $i, "Pfad-Leer|Name-Leer")
    Next
    Else
    For $i = 0 To 11 Step 1
    $IniRead = IniRead (@ScriptDir & "\Save.ini", "Angelegte Dateien", $i, $i)
    $Split = StringSplit ($IniRead, "|")
    GUICtrlSetData ($Button[$i], $Split[2])
    Next
    EndIf
    ; ==============================================================
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3, $Menu1Item3
    Exit
    Case $Menu1Item1
    _DateiAuswahl ()
    Case $Button[0]
    _Button1Klick ()
    EndSwitch
    WEnd
    ; ==============================================================
    Func _DateiAuswahl ()
    $FileOpenDia = FileOpenDialog ("Bitte Datei Auswählen", @DesktopDir, "Videos (*.avi)|Sounds (*.wma;*.wav;*.mp3)", 1)
    If Not @Error Then
    $InputBox = InputBox ("Button auswählen", "Auf welchen Button soll der Effekt gelegt werden? (Nur Zahlen von 0 - 11")
    $InputBox2 = InputBox ("Name auswählen", "Bitte einen Namen für den Button auswählen")
    IniWrite (@ScriptDir & "\Save.ini", "Angelegte Dateien", $InputBox, $FileOpenDia & "|" & $InputBox2)
    GUICtrlSetData ($Button[$InputBox], $InputBox2)
    EndIf
    EndFunc ;==> _DateiAuswahl ()
    ; ==============================================================
    Func _Button1Klick ()
    $IniRead1 = IniRead (@ScriptDir & "\Save.ini", "Angelegte Dateien", 0, "!! FEHLER !!")
    $Split1 = StringSplit ($IniRead1, "|")
    $String1 = StringRight ($Split1[1], 3)
    If $String1 = "mp3" or $String1 = "wav" or $String1 = "wma" Then
    SoundPlay ($Split1[1], 0)
    ElseIf $String1 = "avi" Then
    $GUI2 = GUICreate ("", 500, 500, -1, -1)
    $Avi = GUICtrlCreateAvi ($Split1[1], -1, 0, 0, 500, 500, 0x04)
    GUISetState (@SW_SHOW)
    While 1
    $nMsg2 = GUIGetMsg ()
    Switch $nMsg2
    Case -3
    GUIDelete ($GUI2)
    ExitLoop
    EndSwitch
    WEnd
    EndIf
    EndFunc ;==> _Button1Klick

    [/autoit]

    Ich würde es gerne so machen, dass wenn man einen Button drückt, dessen Array ausgelesen wird.
    Also so dass wenn man $Button[0] drückt, auch dieser ausgelesen wird, wenn man Button[5] drückt, soll dieser ausgelesen werden.
    Also so, dass man nicht

    [autoit]


    Case $Button[0]
    ...
    Case $Button[1]
    ...
    Case $Button[2]
    ...

    [/autoit]


    u.s.w. machen muss. so brauch ich auch nur eine Func, und nicht 12, die den gleichen Inhalt haben...

    hoffe ihr versteht was ich meine.

    PS: Ich weis, man könnte die 12 Buttons in eine For-Next schleife packen, ums zu kü+rzen, aber bitte lasst es so,
    ich finds so übersichtlicher.

  • glaube das selbe Problem hatte ich auch einmal du könntest das per GuiOnEvent Modus machen da weiß ich wies geht :P

    Spoiler anzeigen
    [autoit]

    Dim $Buttons[4]
    $Buttons[0] = $Button1
    $Buttons[1] = $Button2
    $Buttons[2] = $Button3
    $Buttons[3] = $Button4
    For $i = 0 to Ubound($Buttons,1) -1
    GUICtrlSetOnEvent($Button1,"_deinefunktion")
    Next

    [/autoit]


    Aber dann hast du das Problem dass jeder button das selbe macht :) :P
    Hoffe ich hab dir mindestens etwas geholfen :)

  • Ahhh, hab grad ne ganz einfache lösung gefunden.
    So muss ich zwar die ganzen Case abfragen machen, brauh aber nur 1 Func.
    Es ging ja hauptsächlich um die Func, da diese soviel platz brauch.
    Ich stell das script gleich nochmal rein....

    • Offizieller Beitrag


    Ich würde es gerne so machen, dass wenn man einen Button drückt, dessen Array ausgelesen wird.
    Also so dass wenn man $Button[0] drückt, auch dieser ausgelesen wird, wenn man Button[5] drückt, soll dieser ausgelesen werden.

    Entweder den OnEvent-Mode benutzen und dann in der Funktion das Makro @GUI_CtrlId benutzen oder wenn Du beim MessageLoop-Mode bleiben willst, dann eben 12 Case-Anweisungen und die Funktion mit Parameter (Button) aufrufen. Ich würde Ersteres bevorzugen.


    PS: Ich weis, man könnte die 12 Buttons in eine For-Next schleife packen, ums zu kü+rzen, aber bitte lasst es so,
    ich finds so übersichtlicher.

    Aber sowas von umständlich. :D
    War das Erste, was mir ins Auge sprang. Hatte ich schon so geändert:

    [autoit]


    Dim $Button[12]
    For $i = 0 To 11
    $Button[$i] = GUICtrlCreateButton("", 10 + Mod($i, 4) * 150, 10 + Int($i / 4) * 50, 140, 40)
    Next

    [/autoit]
  • Super, thx, mal gucken, ob ichs net doch mit der For schleife mache.
    Klar ist es umständlich, aber i.wie auch besser zu überblicken, oda ^^
    Das mit dem @GUI_CtrlId is geil, immer wieder sretaunlich, was AutoIt alles kann :rofl: