buttonproblem

  • hi leute...
    ich bin gerade dabei mir aus langeweile ein tictactoe prgramm zu schreiben und habe ein problem. :( bei mir stellen 9 button, die ich mit einer for-schleife und einem array dargestellt habe, das spielfeld dar.

    [autoit]

    For $i = 0 To UBound($h_submenu_info, 1) - 1
    $h_submenu_info[$i] = GUICtrlCreateMenuItem($h_submenu_info[$i], $h_mainmenu_info)
    Next
    For $i = 0 To 2
    $h_button[$i] = GUICtrlCreateButton($h_button[$i], $i * 50 + 20, 20, 50, 50, 0x0040)
    GUICtrlSetOnEvent($h_button[$i], "Button_Klick")
    Next
    For $i = 3 To 5
    $h_button[$i] = GUICtrlCreateButton($h_button[$i], ($i - 3) * 50 + 20, 70, 50, 50, 0x0040)
    GUICtrlSetOnEvent($h_button[$i], "Button_Klick")
    Next
    For $i = 6 To 8
    $h_button[$i] = GUICtrlCreateButton($h_button[$i], ($i - 6) * 50 + 20, 120, 50, 50, 0x0040)
    GUICtrlSetOnEvent($h_button[$i], "Button_Klick")
    Next

    [/autoit]

    da ich mit

    [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit]

    arbeite und jeder button fast das selbe macht, habe ich jedem button die selbe funktion zugewiesen. mein problem ist nun das ich nicht weiß wie ich abfragen soll welcher button genau geklickt wurde. :( kann mir jemand helfen? :)

  • Also um das zu vereinfach hätte ich das mit einem 2D-Array gemacht, also so:

    [autoit]

    ;...
    For $i = 1 To 3
    For $ii = 1 To 3
    $Button[$i][$ii] = guictrlcreateButton(...)
    Next
    Next
    ;...

    [/autoit]


    Dann kannste nämlich auch mir 2 For Schleifen diese Button dann abfragen.

    ich hoffe das hilft ein wenig.

    mfg
    Hauke

  • Dafür gibt es das Makro

    [autoit]

    @GUI_CtrlID

    [/autoit]

    , welches innerhalb der aufgerufenen Funktion die ControlID des geklickten Controls definiert.
    Dann könntest du in einer For-Schleife alle Button IDs in $h_button nacheinander durchgehen und mit dem Makro per If-Abfrage vergleichen.

  • Hallo,
    hier ein Beispiel. 8)

    Spoiler anzeigen
    [autoit]


    Opt("GUIOnEventMode", 1)

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

    Global $h_bn[9], _
    $left[9] = [10, 10, 10, 85, 85, 85, 160, 160, 160], _
    $top[9] = [70, 100, 130, 70, 100, 130, 70, 100, 130]

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

    #region GUI tictactoe - Demo ###
    GUICreate("tictactoe - Demo", 320, 200)
    GUISetOnEvent(-3, "_klick")
    For $i = 0 To 8
    $h_bn[$i] = GUICtrlCreateButton($i + 1, $left[$i], $top[$i], 75, 30)
    GUICtrlSetOnEvent(-1, "_klick")
    Next
    GUISetState()
    #endregion GUI tictactoe - Demo ###

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

    #region Schleife tictactoe - Demo ###
    While Sleep(100)
    WEnd
    #endregion Schleife tictactoe - Demo ###

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

    #region Funktion tictactoe - Demo ###
    Func _klick()
    Switch @GUI_CtrlId
    Case -3
    MsgBox(64, "tictactoe - Demo", _
    "Viel Spaß wünscht RR04 !" & @TAB, 3)
    Exit
    Case 3
    MsgBox(64, "tictactoe - Demo", _
    "Button 1 !" & @TAB, 3)
    Case 7
    MsgBox(64, "tictactoe - Demo", _
    "Button 5 !" & @TAB, 3)
    Case 11
    MsgBox(64, "tictactoe - Demo", _
    "Button 9 !" & @TAB, 3)
    EndSwitch
    EndFunc ;==>_klick
    #endregion Funktion tictactoe - Demo ###
    ; Ende

    [/autoit]
  • danke leute :)

    jetzt habe ich aber ein anderes problem :( in einer funktion wird ein "options"fenster erstellt (hier wird immernoch mit

    [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit]

    geabeitet ;) ). sobald ich nun auf den vorhandenen button klicke, damit der inhalt der combobox auslesen werden soll, wird mir eine fehlermeldung angezeigt, da die handle der comboboxen nicht an die funktion für den okbutton übergeben werden :( weiß einer wie ich das machen soll? :)

    [autoit]

    Func _Option()
    GUISetState(@SW_HIDE, $h_GUI_main)
    Local $h_GUI_option = GUICreate("TicTacToe - Option", 190, 140)
    GUICtrlCreateLabel("Spieler 1", 10, 10)
    Local $h_combo_spieler1 = GUICtrlCreateCombo("", 10, 30, 70, 20)
    GUICtrlSetData($h_combo_spieler1, "Kreis|Kreuz|Dreieck")
    GUICtrlCreateLabel("Spieler 2", 100, 10)
    Local $h_combo_spieler2 = GUICtrlCreateCombo("", 100, 30, 70, 20)
    GUICtrlSetData($h_combo_spieler2, "Kreis|Kreuz|Dreieck")
    Local $h_ok = GUICtrlCreateButton("OK", 10, 60, 170, 30)
    GUICtrlSetOnEvent($h_ok, "Button_OK")
    Local $h_abbruch = GUICtrlCreateButton("Abbruch", 10, 100, 170, 30)
    GUICtrlSetOnEvent($h_abbruch, "Button_Abbruch")
    GUISetState(@SW_SHOW, $h_GUI_option)
    EndFunc

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

    Func Button_OK()
    $spieler1_symbol_read = GUICtrlRead($h_combo_spieler1)
    $spieler2_symbol_read = GUICtrlRead($h_combo_spieler2)
    If $spieler1_symbol_read == "" Or $spieler2_symbol_read == "" Then
    MsgBox(64, "Info", "Bitte ein Symbol wählen!")
    ElseIf $spieler1_symbol_read == $spieler2_symbol_read Then
    MsgBox(64, "Info", "Bitte 2 verschiedene Symbole wählen!")
    Else
    GUISetState(@SW_SHOW, $h_GUI_main)
    GUIDelete($h_GUI_option)
    _Neues_Spiel()
    EndIf
    EndFunc

    [/autoit]
  • Du könntest einfach alle Variablen in Option als Global anstatt Local deklarieren. Aber ich würde dir empfehlen, alle GUIs am Anfang des Scripts zu erstellen (dann sind die Variablen sowieso alle Global) und im Verlauf des Scripts nach Bedarf mit GUISetState an- und auszuschalten. GUIs mitten im Script zu erstellen sorgt meist für Probleme..

    • Offizieller Beitrag

    Eine weitere Möglichkeit ist, wenn du eine Gui innerhalb einer Funktion auswerten willst, in den MessageMode zu wechseln.

    [autoit]

    ;beispielcode
    Func Beispiel()
    Local $OldMode = Opt("GUIOnEventMode", 0); Der alte Modus wird in der Variable gespeichert, es wird in den Messagemode geschaltet

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

    ; Hier deine GUI

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

    Local $nMsg= GuiGetMsg()
    While 1
    Switch $nmsg
    Case $irgendwas
    ExitLoop; Damit wird die Schleife beendet und der Alte GUIOnEventMode wird wieder hergestellt
    Case $irgendwas2
    Endswitch
    Wend
    Opt("GUIOnEventMode", $OldMode); Hier wird wieder in den OnEventMode zurückgestellt
    EndFunc

    [/autoit]


    Dieses Vorgehen hat Vor- und Nachteile:
    Vorteil: Die Hauptgui wird nicht abgefragt, solange die andere GUI aktiv ist. Alles was in der GUI pasieren soll, kann innerhalb der Funktion geschehen,
    Globale Variablen sind damit unnötig.
    Nachteil. Die Hauptgui wird nicht abgefragt, solange die andere GUI aktiv ist. ;)