sofortiges Beenden des Programms; flackerndes Label

  • Habe ein kleines Programm zum Thema Geschäftsfähigkeit gebastelt. Einige Aspekte bekomme ich nicht in den Griff:

    • Warum flackert der unten angezeigte Text (= das label)?
    • Warum funktioniert <Alt-e> nicht zum Beenden des Programms?
    • Warum dauert es so lange, bis ein Mausklick auf Beenden bzw. auf den Schließen-Button (x) das Programm beendet?
    • Warum sieht man beim Start den Text des Labels über dem Button?
    [autoit]

    #include <ButtonConstants.au3>#include <GUIConstantsEx.au3>#include <WindowsConstants.au3>
    geschaeftsfaehigkeit()
    Func geschaeftsfaehigkeit() Global $nMsg, $newtext Local $radio1a, $radio1b, $radio1c, $radio2a, $radio2b, $radio2c ; Radio-Buttons Local $label1 ; Textfeld mit Ergebnis Local $r1a, $r1b, $r1c, $r2a, $r2b ; Handles der Radiobuttons Global $beendenbutton ; Handle des Beenden-Buttons
    GUICreate("Geschäftsfähigkeit", 560, 240, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX)) ; GUISetState(@SW_SHOW) ; Anzeige der leeren Dialogbox
    GUICtrlCreateGroup("Alter eingrenzen", 5, 5, 140, 100) $radio1a = GUICtrlCreateRadio("< 7 Jahre", 10, 30, 120, 20) $radio1b = GUICtrlCreateRadio(">= 7 UND < 18 Jahre", 10, 50, 120, 20) $radio1c = GUICtrlCreateRadio(">= 18 Jahre", 10, 70, 120, 20) GUICtrlSetState($radio1b, $GUI_CHECKED) ; Checkbox aktivieren
    GUICtrlCreateGroup("Art der Geistestätigkeit", 5, 110, 545, 80) $radio2a = GUICtrlCreateRadio("nicht nur vorübergehende krankhafte Störung der Geistestätigkeit, die die freie Willensbestimmung ausschließt", 10, 135, 535, 20) $radio2b = GUICtrlCreateRadio("keine Störung der Geistestätigkeit", 10, 155, 535, 20) GUICtrlSetState($radio2b, $GUI_CHECKED) ; Checkbox aktivieren
    $beendenbutton = GUICtrlCreateButton("B&eenden", 495, 200) ; Beenden-Button
    While 1 $iOldOpt = Opt("GUICoordMode", 1) Sleep(800) beenden()
    $r1a = GUICtrlRead($radio1a) ; < 7 $r1b = GUICtrlRead($radio1b) ; >=7 < 18 $r1c = GUICtrlRead($radio1c) ; >= 18 $r2a = GUICtrlRead($radio2a) ; krankhafte Störung der Geistestätigkeit $r2b = GUICtrlRead($radio2b) ; keine krankhafte Störung der Geistestätigkeit

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

    If (($r1a = 1 Or $r1b = 1 Or $r1c = 1) And $r2a = 1) Or ($r1a = 1) Then $newtext = "geschäftsunfähig"
    ElseIf $r1b = 1 And $r2b = 1 Then $newtext = "beschränkt geschäftsfähig"
    ElseIf $r1c = 1 And $r2b = 1 Then $newtext = "geschäftsfähig"
    EndIf
    GUICtrlSetPos($label1, 20, 200) ;UpdateTextControl($label1, $newtext) $label1 = GUICtrlCreateLabel($newtext, -1, -1, 145, 40) ; ;GUISetState(@SW_UNLOCK) WEnd ExitEndFunc ;==>geschaeftsfaehigkeit

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

    Func UpdateTextControl($label1, $newtext) If GUICtrlRead($label1) <> $newtext Then GUICtrlSetData($label1, $newtext) EndIfEndFunc ;==>UpdateTextControl

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

    Func beenden()
    $nMsg = GUIGetMsg() ; Aktuelles GUI Event abfragen Switch $nMsg ; Welches Event ist eingetreten? Case $GUI_EVENT_CLOSE ; Schließen-Button (X oben rechts) Exit ; Beenden Case $beendenbutton ; Klick auf Beenden-Button? Dann... Exit ; Beenden Case Else ; do nothing ... EndSwitchEndFunc ;==>beenden

    [/autoit]

    Einmal editiert, zuletzt von merlinuwe (20. August 2013 um 15:49) aus folgendem Grund: Das Problem ist mittlerweile gelöst

  • 1. Wegen GUICtrlSetPos() und weil du ständig neue Labels erstellst (du legst ständig neue Labels über die alten :thumbdown: )
    2. Weil du soviele andere Dinge machst und die nicht dann auf die Events reagierst wenn sie ausgelöst werden
    3. siehe 2
    4. Weil du es mit den Koordinaten -1, -1 erstellst

    Woher hast du dir denn die ganzen Scriptfetzen zusammenkopiert?
    Verstehst du was du alles machst?

    Du solltest die ganze While 1 Schleife mal so umbauen dass darin nur auf Events reagiert wird. D.h. in der While sollte nur dein Switch $nMsg stehen den du in die beenden Funktion gepackt hast.
    All die anderen Dinge musst du nur ausführen wenn ein Radiobutton gedrückt wird

  • Danke für die Hinweise. Hier ist das umgeschriebene, nun zur Zufriedenheit funktionierende Programm:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>

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

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

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

    Opt("GUIOnEventMode", 1) ; OnEvent-Funktionen werden nur aufgerufen, wenn die Option GUIOnEventMode auf 1 gesetzt ist
    Opt("GUICoordMode", 1) ; 1 = absolute Koordinaten (Standard) relativ zur Dialog Box.

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

    geschaeftsfaehigkeit()

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

    Func geschaeftsfaehigkeit()
    Global $nMsg, $newtext
    Global $radio1a, $radio1b, $radio1c, $radio2a, $radio2b, $radio2c ; Radio-Buttons
    Global $label1 ; Textfeld mit Ergebnis
    Local $r1a, $r1b, $r1c, $r2a, $r2b ; Handles der Radiobuttons
    Global $beendenbutton ; Handle des Beenden-Buttons

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

    GUICreate("Geschäftsfähigkeit ermitteln", 560, 240, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX)) ;

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

    GUICtrlCreateGroup("Alter eingrenzen" , 5, 5, 140, 100)
    $radio1a = GUICtrlCreateRadio("< 7 Jahre" , 10, 30, 120, 20)
    $radio1b = GUICtrlCreateRadio(">= 7 UND < 18 Jahre" , 10, 50, 120, 20)
    $radio1c = GUICtrlCreateRadio(">= 18 Jahre" , 10, 70, 120, 20)
    GUICtrlSetState($radio1b, $GUI_CHECKED) ; Checkbox aktivieren

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

    GUICtrlCreateGroup("Art der Geistestätigkeit", 5, 110, 545, 80)
    $radio2a = GUICtrlCreateRadio("nicht nur vorübergehende krankhafte Störung der Geistestätigkeit, die die freie Willensbestimmung ausschließt", 10, 135, 535, 20)
    $radio2b = GUICtrlCreateRadio("keine Störung der Geistestätigkeit", 10, 155, 535, 20)
    GUICtrlSetState($radio2b, $GUI_CHECKED) ; Checkbox aktivieren

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

    $beendenbutton = GUICtrlCreateButton("&Beenden", 495, 200) ; Beenden-Button
    GUICtrlSetOnEvent($beendenbutton, "_exit") ; Beenden des Programms über den Beenden-Button

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit") ; Beenden des Programms über das Kreuz oben rechts

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

    HotKeySet("{ESC}", "_exit") ; Damit man das Progamm auch mit ESC sofort beenden kann

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

    $label1 = GUICtrlCreateLabel($newtext, 10, 200, 145, 40) ; Das Textfeld, in dem das Ergebnis angezeigt wird

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

    GUISetState(@SW_SHOW) ; Anzeige der Dialogbox mit allen GUICtrlCreate ...

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

    While 1
    logik()
    UpdateTextControl($label1, $newtext)
    WEnd
    EndFunc ;==>geschaeftsfaehigkeit

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

    Func UpdateTextControl($label1, $newtext) ; damit das Label nicht flimmert wird die Variable $newtext nur bei einer tatsächlichen Änderung neu beschrieben
    If GUICtrlRead($label1) <> $newtext Then
    GUICtrlSetData($label1, $newtext)
    EndIf
    EndFunc ;==>UpdateTextControl

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

    Func _exit() ; Für das Beenden des Programms
    Exit 0
    EndFunc

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

    Func logik() ; hier liegt die juristische Logik des Problems

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

    $r1a = GUICtrlRead($radio1a) ; < 7
    $r1b = GUICtrlRead($radio1b) ; >=7 < 18
    $r1c = GUICtrlRead($radio1c) ; >= 18
    $r2a = GUICtrlRead($radio2a) ; krankhafte Störung der Geistestätigkeit
    $r2b = GUICtrlRead($radio2b) ; keine krankhafte Störung der Geistestätigkeit

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

    ;If (($r1a = 1 Or $r1b = 1 Or $r1c = 1) And $r2a = 1) Or ($r1a = 1) Then ; kompliziertere Lösung ...
    If $r1a = 1 Or $r2a = 1 Then ; einfachere Lösung
    $newtext = "geschäftsunfähig"

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

    ElseIf $r1b = 1 And $r2b = 1 Then
    $newtext = "beschränkt geschäftsfähig"

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

    ElseIf $r1c = 1 And $r2b = 1 Then
    $newtext = "geschäftsfähig"

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

    EndIf
    EndFunc

    [/autoit]

    Edit Oscar: Bitte bei längeren Scripten immer auch den Spoiler-Tag benutzen. Habe ich hier mal eingefügt.

    Einmal editiert, zuletzt von Oscar (21. August 2013 um 07:52)

    • Offizieller Beitrag

    Beim OnEventMode sollte (im Gegensatz zum MsgLoopMode) innerhalb der While...Wend-Schleife immer auch ein Sleep vorhanden sein, weil sonst die Prozessorlast auf 100% steigt.
    Also z.B. ein Sleep(20) hinzufügen reicht schon. Je nachdem, wie oft der Rest aktualisiert werden soll (könnte man übrigens auch per AdlibRegister machen), kann der Sleep-Befehl auch größer ausfallen.

  • So wie du es hast wird immer noch ständig logik() und UpdateTextControl() ausgeführt.
    Nur auf Events reagieren würde ungefähr so gehen ;)

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>

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

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

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

    Opt("GUIOnEventMode", 1) ; OnEvent-Funktionen werden nur aufgerufen, wenn die Option GUIOnEventMode auf 1 gesetzt ist
    Opt("GUICoordMode", 1) ; 1 = absolute Koordinaten (Standard) relativ zur Dialog Box.

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

    geschaeftsfaehigkeit()

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

    Func geschaeftsfaehigkeit()
    Global $nMsg, $newtext
    Global $radio1a, $radio1b, $radio1c, $radio2a, $radio2b, $radio2c ; Radio-Buttons
    Global $label1 ; Textfeld mit Ergebnis
    Local $r1a, $r1b, $r1c, $r2a, $r2b ; Handles der Radiobuttons
    Global $beendenbutton ; Handle des Beenden-Buttons

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

    GUICreate("Geschäftsfähigkeit ermitteln", 560, 240, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX)) ;

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

    GUICtrlCreateGroup("Alter eingrenzen", 5, 5, 140, 100)
    $radio1a = GUICtrlCreateRadio("< 7 Jahre", 10, 30, 120, 20)
    GUICtrlSetOnEvent($radio1a, "logik")
    $radio1b = GUICtrlCreateRadio(">= 7 UND < 18 Jahre", 10, 50, 120, 20)
    GUICtrlSetOnEvent($radio1b, "logik")
    $radio1c = GUICtrlCreateRadio(">= 18 Jahre", 10, 70, 120, 20)
    GUICtrlSetOnEvent($radio1c, "logik")
    GUICtrlSetState($radio1b, $GUI_CHECKED) ; Checkbox aktivieren

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

    GUICtrlCreateGroup("Art der Geistestätigkeit", 5, 110, 545, 80)
    $radio2a = GUICtrlCreateRadio("nicht nur vorübergehende krankhafte Störung der Geistestätigkeit, die die freie Willensbestimmung ausschließt", 10, 135, 535, 20)
    GUICtrlSetOnEvent($radio2a, "logik")
    $radio2b = GUICtrlCreateRadio("keine Störung der Geistestätigkeit", 10, 155, 535, 20)
    GUICtrlSetOnEvent($radio2b, "logik")
    GUICtrlSetState($radio2b, $GUI_CHECKED) ; Checkbox aktivieren

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

    $beendenbutton = GUICtrlCreateButton("&Beenden", 495, 200) ; Beenden-Button
    GUICtrlSetOnEvent($beendenbutton, "_exit") ; Beenden des Programms über den Beenden-Button

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit") ; Beenden des Programms über das Kreuz oben rechts

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

    HotKeySet("{ESC}", "_exit") ; Damit man das Progamm auch mit ESC sofort beenden kann

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

    $label1 = GUICtrlCreateLabel($newtext, 10, 200, 145, 40) ; Das Textfeld, in dem das Ergebnis angezeigt wird

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

    GUISetState(@SW_SHOW) ; Anzeige der Dialogbox mit allen GUICtrlCreate ...

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

    While 1
    Sleep(100)
    WEnd
    EndFunc ;==>geschaeftsfaehigkeit

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

    Func _exit() ; Für das Beenden des Programms
    Exit 0
    EndFunc ;==>_exit

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

    Func logik() ; hier liegt die juristische Logik des Problems

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

    $r1a = GUICtrlRead($radio1a) ; < 7
    $r1b = GUICtrlRead($radio1b) ; >=7 < 18
    $r1c = GUICtrlRead($radio1c) ; >= 18
    $r2a = GUICtrlRead($radio2a) ; krankhafte Störung der Geistestätigkeit
    $r2b = GUICtrlRead($radio2b) ; keine krankhafte Störung der Geistestätigkeit

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

    ;If (($r1a = 1 Or $r1b = 1 Or $r1c = 1) And $r2a = 1) Or ($r1a = 1) Then ; kompliziertere Lösung ...
    If $r1a = 1 Or $r2a = 1 Then ; einfachere Lösung
    $newtext = "geschäftsunfähig"
    ElseIf $r1b = 1 And $r2b = 1 Then
    $newtext = "beschränkt geschäftsfähig"
    ElseIf $r1c = 1 And $r2b = 1 Then
    $newtext = "geschäftsfähig"
    EndIf
    If GUICtrlRead($label1) <> $newtext Then
    GUICtrlSetData($label1, $newtext)
    EndIf
    EndFunc ;==>logik

    [/autoit]