2ter Klick auf Button

  • Hallo,
    ich wollte fragen ob es möglich ist einen 2ten Klick auf einem Button festzustellen?
    Der 2te Klick sollte dann nämlich eine Schleife beenden.

    Sollte quasi so laufen:


    1ter Klick -> Messungen starten bis beendet.
    --
    Button erhält durch GUI_CtrlButton_SetText einen neuen Namen
    --
    2ter Klick ->Beendet die Messungen.
    --
    Button erhält ursprünglichen Namen durch GUI_CtrlButton_SetText

    Hoffe mir ist zu helfen! ;)

    PS:
    SuFu hat nichts ergeben :/

    Einmal editiert, zuletzt von dRoZ (21. Oktober 2011 um 08:17)

  • Da gibts mehrere Möglichkeiten. Da nicht genau beschreibst für was das brauchst kann man nur Raten. Hier mal zwei Möglichkeiten:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 263, 86, 192, 124)
    $Button1 = GUICtrlCreateButton("Button1", 56, 16, 75, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0, "", "erster Klick")
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0, "", "zweiter Klick")
    EndSwitch
    WEnd
    EndSwitch
    WEnd

    [/autoit]
    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 263, 86, 192, 124)
    $Button1 = GUICtrlCreateButton("Button1", 56, 16, 75, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $wert = 0
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    If $wert = 0 Then
    MsgBox(0, "", "erster Klick")
    $wert = 1
    ElseIf $wert = 1 Then
    MsgBox(0, "", "zweiter Klick")
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Steht doch eigentlich oben geschrieben wie ich das haben möchte! ;)

    So lange die Messung läuft wird ein Wert angezeigt, das klappt soweit ja auch, dazu hier das Skript:

    [autoit]

    Case $msg = $Button_5

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

    GUICtrlSetState($Button_5, $GUI_HIDE)
    $Button_6 = GUICtrlCreateButton("Messen stoppen", 190, 120, 100, 33)

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

    $checker = 0

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

    While $checker = 0
    Sleep(200)
    ; Distanzmessung
    _SendSerialString($SendPort, String("/020D0059."))
    $einheit= StringMid((_ReceiveStringWait($SendPort, $MinBufferSize, $MaxWaitTime)),9,6)

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

    ; Abfrage ob Messergebnis gültig ist
    If $einheit = "hhhhhh" Then
    MsgBox(0, "Error", "Außerhalb der Reichweite!", 0.5)
    ElseIf $einheit = "llllll" Then
    MsgBox(0, "Error", "Außerhalb der Reichweite!", 0.5)
    Else
    GUICtrlCreateLabel ($einheit, 40, 130, 60, 33)
    GUICtrlCreateLabel ("mm", 100, 130, 20, 33)
    EndIf

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

    If $msg = $Button_6 Then
    $checker = 1
    ExitLoop
    EndIf

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

    WEnd

    [/autoit]

    Mal abgesehen davon das es nicht klappt wie es soll...
    Das Skript ist momentan mit einem zusätzlichen Button belegt, finde ich persönlich aber etwas "unelegant", würde lieber
    mit nur einem Button schauen ob dieser das 2te Mal geklickt wurde und dann soll die Schleife abbrechen!


  • Das Skript ist momentan mit einem zusätzlichen Button belegt, finde ich persönlich aber etwas "unelegant", würde lieber
    mit nur einem Button schauen ob dieser das 2te Mal geklickt wurde und dann soll die Schleife abbrechen!

    Und genau das steht oben in den zwei Beispielen. Das ich dir hier kein fertiges Scipt schreibe sollte dir eigentlich klar sein ;).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Und genau das steht oben in den zwei Beispielen. Das ich dir hier kein fertiges Scipt schreibe sollte dir eigentlich klar sein ;).


    Habe ich verstanden soweit, aber vielleicht könntest du mir ja auch noch eben erklären warum bisher das Skript nicht abgebrochen wurde mit dem zweiten Button?
    Wenn ich das richtig sehe entspricht es genau deinem Schema, nur das du überprüfst ob der erste Button nochmal geklickt wird.
    Versteh mich nun nicht falsch, du hast mir das gezeigt was ich sehen wollte, danke auch dafür, aber warum funktionierte es bisher eigentlich nicht?^^

  • Wie schon bei deinen Eingangsthread kann man ohne komplettest Script nur Raten. Vermute mal das du noch eine zweite Schleife um deine "Messschleife" hast. ExitLoop beendet nur die Messschleife aber die andere läuft weiter.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Zu diesem Zeitpunkt soll ja auch einfach keine andere Schleife beendet werden, nur der Case $msg = $Button_5.
    Ich verstehe nicht so ganz was an der bisherigen schreibweise falsch ist.

    • Offizieller Beitrag

    Du hast eine Hauptschleife, mit der du die Msg erhältst (GUIGetMsg).
    Bei Druck auf den Button eröffnest du eine Endlosschleife, die erst verlassen wird, wenn der Button erneut gedrückt wird -- ABER diese Msg wirst du nie erhalten, da du die Msg-Schleife ja nicht mehr durchläufst, sondern in der inneren "Button"-Schleife hängst.
    Skript falsch aufgebaut. - Die Abfrage gehört mit in die Hauptschleife.

  • Kleines Bsp:

    [autoit]

    ;...
    $bButtonLoop=0
    ;...
    $msg=GuiGetMsg()
    ;...
    switch $msg
    case $DeinButton
    $bButtonLoop = 1 - $bButtonLoop
    While $bButtonLoop
    $msg=GuigetMsg()
    switch $msg
    case $DeinButton
    $bButtonLoop=1-$bButtonLoop
    endswitch
    Wend
    endswitch

    [/autoit]


    (( Nur Grob, solltest das wichtigste erkennen))

    Wems gefällt (Sollte klappen, habs nicht getestet). Ih bevorzuge aber den OnEventMode, ist einfach schöner ^^

  • Einfachstes Beispiel wie so etwas funktioniert findet man in der Hilfe zu GuiCtrlCreateProgress:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>

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

    Opt('MustDeclareVars', 1)

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

    Example()

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

    Func Example()
    Local $progressbar1, $progressbar2, $button, $wait, $s, $msg, $m

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

    GUICreate("Meine GUI Progressbar", 220, 100, 100, 200)
    $progressbar1 = GUICtrlCreateProgress(10, 10, 200, 20)
    GUICtrlSetColor(-1, 32250); Funktioniert nicht mit Windows XP Style
    $progressbar2 = GUICtrlCreateProgress(10, 40, 200, 20, $PBS_SMOOTH)
    $button = GUICtrlCreateButton("Start", 75, 70, 70, 20)
    GUISetState()

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

    $wait = 100; Warte 100ms bis zum nächsten Schritt
    $s = 0; Progressbar-Startposition
    Do
    $msg = GUIGetMsg()
    If $msg = $button Then
    GUICtrlSetData($button, "Stop")
    For $i = $s To 100
    If GUICtrlRead($progressbar1) = 50 Then MsgBox(0, "Info", "Die Hälfte ist fertig ...", 1)
    $m = GUIGetMsg()

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

    If $m = -3 Then ExitLoop

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

    If $m = $button Then
    GUICtrlSetData($button, "Weiter")
    $s = $i ; Speichere aktuelle Balkenposition in $s
    ExitLoop
    Else
    $s = 0
    GUICtrlSetData($progressbar1, $i)
    GUICtrlSetData($progressbar2, (100 - $i))
    Sleep($wait)
    EndIf
    Next
    If $i > 100 Then
    ; $s=0
    GUICtrlSetData($button, "Start")
    EndIf
    EndIf
    Until $msg = $GUI_EVENT_CLOSE
    EndFunc ;==>Example

    [/autoit]

    mfg autoBert