Welcher Button wurde gedrückt

  • Hi, ich möcht herausfinden, ob Button 1 oder 2 gedrückt wurde.
    Danke schon mal.

    [autoit]


    $hGui = GUICreate("Meine GUI", 300, 200)

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

    $Btn1 = GUICtrlCreateButton("Button1", 110, 100, 70, 20)
    $Btn2 = GUICtrlCreateButton("Button2", 110, 140, 70, 20)

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

    GUISetState()

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

    While True
    $Msg = GUIGetMsg()
    Switch $Msg
    Case -3
    ExitLoop
    Case $Btn1, $Btn2
    $newID = GUICtrlGetHandle($Msg)
    ConsoleWrite("Button-X : " & $newID & @CRLF)
    If $newID = 0x00110574 Then MsgBox(64, "GUICtrlGetHandle", '$Btn1')
    If $newID = 0x001503E2 Then MsgBox(64, "GUICtrlGetHandle", '$Btn2')
    MsgBox(64, "xxx", $newID)
    EndSwitch
    WEnd
    ; Ende

    [/autoit]
  • Mach doch einfach 2 Cases.

    [autoit]

    $hGui = GUICreate("Meine GUI", 300, 200)

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

    $Btn1 = GUICtrlCreateButton("Button1", 110, 100, 70, 20)
    $Btn2 = GUICtrlCreateButton("Button2", 110, 140, 70, 20)

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

    GUISetState()

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

    While True
    $Msg = GUIGetMsg()
    Switch $Msg
    Case -3
    ExitLoop
    Case $Btn1
    MsgBox(64, "", "Button1 wurde gedrückt.")

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

    Case $Btn2
    MsgBox(64, "", "Button2 wurde gedrückt.")
    EndSwitch
    WEnd
    ; Ende

    [/autoit]
  • alpines
    Ja, das ist richtig.
    Aber hier würde ich sehr viel Code wiederholen.
    Im OnEvent Modus stehen dafür auch Makros zur Verfügung!


    Lager den Code doch einfach in eine Funktion aus und rufe die dann individuel mit Parametern auf :whistling:

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Wenn du es dann unbedingt so Kompliziert möchtest :rolleyes: , sollte das gehen:

    Spoiler anzeigen
    [autoit]


    $hGui = GUICreate("Meine GUI", 300, 200)

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

    $Btn1 = GUICtrlCreateButton("Button1", 110, 100, 70, 20)
    $Btn2 = GUICtrlCreateButton("Button2", 110, 140, 70, 20)

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

    GUISetState()

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

    While True
    $Msg = GUIGetMsg()
    Switch $Msg
    Case -3
    ExitLoop
    Case $Btn1, $Btn2
    ;$newID = GUICtrlGetHandle($Msg)
    ;ConsoleWrite("Button-X : " & $newID & @CRLF)
    If $Msg = $Btn1 Then MsgBox(64, "GUICtrlGetHandle", '$Btn1')
    If $Msg = $Btn2 Then MsgBox(64, "GUICtrlGetHandle", '$Btn2')
    ;MsgBox(64, "xxx", $newID)
    EndSwitch
    WEnd

    [/autoit]

    Wenn das deinen Wünschen nicht entspricht habe ich deine Frage nicht ganz verstanden.

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Also mittlerweile favorisiere ich den OnEventMode. Finde das viel übersichtlcher, wenn ich meine Ereignisse in eine extra Funktion packe. Desweiteren soll es ja auch Resourcenschonender sein. ^^

    Habe mal das Beispiel nach OnEvent umgeschrieben. Ich hoffe es kann dir da weiterhelfen.

    [autoit]


    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1);Die Gui auf den OnEventMode umschalten
    $hGui = GUICreate("Meine GUI", 300, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    $Btn1 = GUICtrlCreateButton("Button1", 110, 100, 70, 20)
    GUICtrlSetOnEvent($Btn1,"Button1") ; Hier wird dem Button die Funktion "Button1" zugewiesen. Das gleiche macht man dann auch mit dem zweiten Button.....
    $Btn2 = GUICtrlCreateButton("Button2", 110, 140, 70, 20)
    GUICtrlSetOnEvent($Btn2,"Button2")

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

    GUISetState()

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

    While True
    ;soll hier nix machen ... und im englischen Autoit Forum hab ich irgendwo gelesen, dass man Sleep mittlerweile weglassen kann. (Update: Nach Nachmessen ... sollte man es drin lassen, wenn man Resourcen sparen will)
    WEnd

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

    Func Button1() ;
    MsgBox(4096,"","Ich bin Button Nr. 1")
    EndFunc
    ; Ende
    Func Button2()
    MsgBox(4096,"","Ich bin Button Nr. 2")
    EndFunc

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

    Func CLOSEClicked() ;Damit man auch das Fenster wieder schliessen kann, da im OnEventMode ohne dies nix passiert.
    MsgBox(0, "GUI Event", "Du hast auf CLOSE geklickt! Programm wird beendet...")
    Exit
    EndFunc

    [/autoit]

    Habe da auch noch so ein paar Kleinigkeiten hinzugefügt.... aber jede "Guiphilosophie" hat ihre Vor- und Nachteile. Von daher .. liegt es ganz an dir.

    3 Mal editiert, zuletzt von BinäryChief (8. September 2013 um 02:13)

  • Natürlich kann man das Sleep(100) weglassen, aber denk doch mal nach was das bringt?
    Die CPU wird die ganze Zeit die Schleife durch und durchlaufen, obwohl nichts kommt.

    Wenn du jetzt mal folgendes

    [autoit]

    While 1
    WEnd

    [/autoit]


    mit

    [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit]

    vergleichst, dann sag mir das der beim 2. die CPU-Auslastung sofort extrem ansteigt.

  • Ja gebe dir recht... und man kann es nicht weglassen, wenn man die CPU schonen will. Habe es nun mal nachgemessen. Tja man darf sich halt nicht auf alles verlassen, was man so in diversen Threads liest. Aber letztendlich weichen wir hier vom Thema ab .. geht ja nicht um sleep, mit dessen Threads man wohl bis zum Mond kommt ^^, sondern um die Frage wie man rausfindet welcher Button gedrückt wurde.

  • Hi,
    im Oneventmodus geht das so:

    Spoiler anzeigen
    [autoit]

    Opt("GUIOnEventMode", 1)

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

    $hgui = GUICreate("getid", 220, 220)
    For $i = 0 To 15 ;16 Buttons erzeugen
    $id = GUICtrlCreateButton(Chr($i + 65), 10 + Mod($i, 4) * 50, 10 + Int($i / 4) * 50, 40, 40);raster
    GUICtrlSetOnEvent(-1, "getid") ;funktion zuweisen
    Next
    GUISetOnEvent(-3, "_exit") ;ende
    GUISetState()

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

    While Sleep(10)
    WEnd

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

    Func getid()
    $id = @GUI_CtrlId ;gibt die ID zurück
    MsgBox(0, "Test", "Es wurde der Button mit der ID= " & $id & " gedrückt!", 1)
    EndFunc ;==>getid

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

    Func _exit() ;ende
    Exit
    EndFunc ;==>_exit

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (8. September 2013 um 02:24)

  • Vielen Dank noch mal! ;)

    [autoit]


    Opt("GUIOnEventMode", 1)
    $hGui = GUICreate("Meine GUI", 300, 200)
    GUISetOnEvent(-3, "SpecialEvents")
    $Btn1 = GUICtrlCreateButton("Button1", 110, 100, 70, 20)
    GUICtrlSetOnEvent(-1, "SpecialEvents")
    $Btn2 = GUICtrlCreateButton("Button2", 110, 140, 70, 20)
    GUICtrlSetOnEvent(-1, "SpecialEvents")

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

    GUISetState()

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

    While Sleep(1000)
    WEnd

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

    Func SpecialEvents()
    Switch @GUI_CtrlId
    Case -3
    MsgBox(0, "Close Pressed", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle)
    Exit
    Case 3, 4
    $Button = "$Btn1"
    If @GUI_CtrlId = 4 Then $Button = "$Btn2"
    MsgBox(0, "Window", "Folgender Button wurde gedrückt: " & $Button)
    ;~ Case 3
    ;~ MsgBox(0, "Window", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle)
    ;~ Case 4
    ;~ MsgBox(0, "Window", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle)
    EndSwitch
    EndFunc ;==>SpecialEvents
    ; Ende

    [/autoit]