alternative aktuallisierungsschleife zu while

  • hallo liebe freunde,

    es geht um folgendes:
    mein script ha eine whileschleife in der er abfrägt ob eine checkbox angeklickt worden ist, oder nicht..
    sobald diese angeklickt wird gibt sie ein updown frei
    die funktioniert auch, jedoch wird die whileschleife so lange wiederholt bis der user etwas macht..
    dies führt dazu das das updown "flimmert", da es ständig aktualisiert wird..

    dafür gibt es doch sicher eine bessere lösung oder?

    hier mein script:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEX.au3>
    #include <EditConstants.au3>

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

    $main = GUICreate("Test", 150, 100)
    $checkbox = GUICtrlCreateCheckbox("test", 20, 30)
    $input = GUICtrlCreateInput("0", 80, 30, 40, 20, $ES_NUMBER)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $updown1 = GUICtrlCreateUpdown($input)
    GUICtrlSetLimit(-1, 100, 0)

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

    GUISetState()

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

    While 1

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

    If GUICtrlRead($checkbox) = $GUI_CHECKED Then
    GUICtrlSetState($input, $GUI_ENABLE)
    Else
    GUICtrlSetData($input, "")
    GUICtrlSetState($input, $GUI_DISABLE)
    EndIf

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

    $Main = GUIGetMsg()
    Switch $Main
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]
  • Ja, der On-Event Mode. Hba dein Script mal umgestellt:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEX.au3>
    #include <EditConstants.au3>

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

    $main = GUICreate("Test", 150, 100)
    Opt("GuiOnEventMode", 1)
    GuiSetOnEvent($GUI_EVENT_CLOSE, "ende")
    $checkbox = GUICtrlCreateCheckbox("test", 20, 30)
    GuiCtrlSetOnEvent(-1, "checkboxclick")
    $input = GUICtrlCreateInput("0", 80, 30, 40, 20, $ES_NUMBER)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $updown1 = GUICtrlCreateUpdown($input)
    GUICtrlSetLimit(-1, 100, 0)
    GUISetState()

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

    While 1
    Sleep(250)
    WEnd

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

    Func checkboxclick()
    If BitAND(GUICtrlRead($checkbox),$GUI_CHECKED) Then
    GUICtrlSetState($input, $GUI_ENABLE)
    Else
    GUICtrlSetData($input, "")
    GUICtrlSetState($input, $GUI_DISABLE)
    EndIf

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

    EndFunc

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

    Func ende()
    Exit
    EndFunc

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

    Die Checkbox gibt übrigens auch die Id als msg zurück!

  • [autoit]

    While 1

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


    WEnd

    [/autoit]

    Macht unnötig CPU Last besser ist

    [autoit]

    While Sleep(50)
    WEnd

    [/autoit]

    Und diese Stelle

    [autoit]

    If GUICtrlRead($checkbox) = $GUI_CHECKED Then

    [/autoit]

    würd ich so machen

    [autoit]

    If BitAND(GUICtrlRead($checkbox),$GUI_CHECKED) Then

    [/autoit]
  • hallo

    danke euch für die schnellen antworten... mir stelln sich jedoch 2 fragen..
    das mit

    [autoit]

    Opt("GuiOnEventMode", 1)

    [/autoit]

    ist ja eine sehr sehr aufwendige sache, da man jedes einzelne case rausnehmen muss und es mit funktionen ersetzen muss..
    bekomm mein script so nicht zum laufen.. ist es denn nicht möglich diesen modus nur auf bestimmte teile des scriptes an zu setzen..
    schließlich gibt es die parameter 1 (GuiOnEventMode ein) und 0 für GuiOnEventMode aus

    2. frage:
    höre jetzt schon zum 2. mal das

    [autoit]

    If BitAND(GUICtrlRead($checkbox),$GUI_CHECKED) Then

    [/autoit]

    besser ein soll...
    meine lösung funktioniert auch tadellos.. was ist daran "besser"???

  • Zu erstens: Du kannst den OnEvent Modus wo du willst an und wieder ausschalten.
    Zu zweitens: BitAND Prüft ob ein Wert in einem Wert ist, das ist daher besser weil GuiCtrlRead bei einer Checkbox auch mal kombinierte Style zurückgeben kann und dann würde die einfache If abfrage nicht reagieren wenn angekreuzt ist.

  • Ich hätte das ganze jetzt so gelöst.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEX.au3>
    #include <EditConstants.au3>

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

    $main = GUICreate("Test", 150, 100)
    $checkbox = GUICtrlCreateCheckbox("test", 20, 30)
    $input = GUICtrlCreateInput("0", 80, 30, 40, 20, $ES_NUMBER)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $updown1 = GUICtrlCreateUpdown($input)
    GUICtrlSetLimit(-1, 100, 0)

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

    GUISetState()
    $checkboxstate = GUICtrlRead($checkbox)

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

    While 1
    If GUICtrlRead($checkbox) <> $checkboxstate Then ; führt die if abfrage nur aus wenn sich der status der Checkbox geändert hat
    If GUICtrlRead($checkbox) = $GUI_CHECKED Then
    GUICtrlSetState($input, $GUI_ENABLE)
    Else
    GUICtrlSetData($input, "")
    GUICtrlSetState($input, $GUI_DISABLE)
    EndIf
    $checkboxstate=GUICtrlRead($checkbox) ; Setzt den neuen status fest
    EndIf
    $main = GUIGetMsg()
    Switch $main
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Mfg
    monkey

    Monkey - die finale Potenz von göttlich!
    Sloganizer

  • ist ja eine sehr sehr aufwendige sache, da man jedes einzelne case rausnehmen muss und es mit funktionen ersetzen muss..


    nö.

    Einfach eine Funktion _OnEventHandler() anlegen, und alle Controls mit dieser Verknüpfen. Dann kannst du deinen "normalen" GUIGetMsg() Swtich/Case übernehmen, nur dass du statt

    [autoit]

    Switch $nMsg
    Case -3
    Exit
    EndSwitch

    [/autoit]


    [autoit]

    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch

    [/autoit]

    Nur leider scheint das kaum einer zu wissen oder zu nutzen. Find ich irgendwie dumm.

  • Monkey, das ist GENAU DAS was ich gesucht hab!

    sehr schöne Lösung. gefällt mir wirklich gut.
    vielen dank an euch allen.

    aller beste grüße Inferior

    EDIT:

    also das von SEuBo versteh ich leider nicht ?(?(
    und das von monkey flackert doch nicht.. weil es ja auch nur aufgerufen wird wenn der status der checkbox sich ändert

  • also das von SEuBo versteh ich leider nicht


    Aus dem

    Spoiler anzeigen
    [autoit]

    $hGUI = GUICreate("",240,90)
    $cButton = GUICtrlCreateButton("Klick mich", 20, 20, 200, 20)
    $cButton_2 = GUICtrlCreateButton("Klick mich auch mal", 20, 50, 200, 20)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    Case $cButton
    MsgBox(0,"","Du hast Button #1 geklickt!")
    Case $cButton_2
    MsgBox(0,"","Du hast den anderen Knopf gedrückt")
    EndSwitch
    WEnd

    [/autoit]

    Wird das:

    Spoiler anzeigen
    [autoit]

    Opt("GUIOnEventMode", 1)
    $hGUI = GUICreate("", 240, 90)
    GUISetOnEvent(-3, "_OnEventHandler")
    $cButton = GUICtrlCreateButton("Klick mich", 20, 20, 200, 20)
    GUICtrlSetOnEvent(-1, "_OnEventHandler")
    $cButton_2 = GUICtrlCreateButton("Klick mich auch mal", 20, 50, 200, 20)
    GUICtrlSetOnEvent(-1, "_OnEventHandler")
    GUISetState()

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

    While Sleep(1000)
    WEnd

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

    Func _OnEventHandler()
    Switch @GUI_CtrlId
    Case -3
    Exit
    Case $cButton
    MsgBox(0, "", "Du hast Button #1 geklickt!")
    Case $cButton_2
    MsgBox(0, "", "Du hast den anderen Knopf gedrückt")
    EndSwitch
    EndFunc ;==>_OnEventHandler

    [/autoit]
  • Also in einer Zeile steht: GUISetOnEvent(-3, "_OnEventHandler")

    Die Hilffe sagt: GUICtrlSetOnEvent ( controlID, "function" )

    Frage, gibt es irgendwo eine Erklärung zu den controlID-Nr. -1, -3, usw. das könnte für einige User/innen sehr hilfreich sein.

    Was macht eigentlich ein controlID = -2 ?

    So, mal brav weiter die Hilfe studiert. ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Steht alles in der GUIConstantsEx.au3:

    Spoiler anzeigen
    [autoit]

    #include-once

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

    ; #INDEX# =======================================================================================================================
    ; Title .........: GUIConstantsEx
    ; AutoIt Version : 3.2
    ; Language ......: English
    ; Description ...: Constants to be used in GUI applications.
    ; Author(s) .....: Jpm, Valik
    ; Dll ...........:
    ; ===============================================================================================================================

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

    ; #CONSTANTS# ===================================================================================================================
    ; Events and messages
    Global Const $GUI_EVENT_CLOSE = -3
    Global Const $GUI_EVENT_MINIMIZE = -4
    Global Const $GUI_EVENT_RESTORE = -5
    Global Const $GUI_EVENT_MAXIMIZE = -6
    Global Const $GUI_EVENT_PRIMARYDOWN = -7
    Global Const $GUI_EVENT_PRIMARYUP = -8
    Global Const $GUI_EVENT_SECONDARYDOWN = -9
    Global Const $GUI_EVENT_SECONDARYUP = -10
    Global Const $GUI_EVENT_MOUSEMOVE = -11
    Global Const $GUI_EVENT_RESIZED = -12
    Global Const $GUI_EVENT_DROPPED = -13

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

    Global Const $GUI_RUNDEFMSG = 'GUI_RUNDEFMSG'

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

    ; State
    Global Const $GUI_AVISTOP = 0
    Global Const $GUI_AVISTART = 1
    Global Const $GUI_AVICLOSE = 2

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

    Global Const $GUI_CHECKED = 1
    Global Const $GUI_INDETERMINATE = 2
    Global Const $GUI_UNCHECKED = 4

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

    Global Const $GUI_DROPACCEPTED = 8
    Global Const $GUI_NODROPACCEPTED = 4096
    Global Const $GUI_ACCEPTFILES = $GUI_DROPACCEPTED ; to be suppressed

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

    Global Const $GUI_SHOW = 16
    Global Const $GUI_HIDE = 32
    Global Const $GUI_ENABLE = 64
    Global Const $GUI_DISABLE = 128

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

    Global Const $GUI_FOCUS = 256
    Global Const $GUI_NOFOCUS = 8192
    Global Const $GUI_DEFBUTTON = 512

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

    Global Const $GUI_EXPAND = 1024
    Global Const $GUI_ONTOP = 2048

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

    ; Font
    Global Const $GUI_FONTITALIC = 2
    Global Const $GUI_FONTUNDER = 4
    Global Const $GUI_FONTSTRIKE = 8

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

    ; Resizing
    Global Const $GUI_DOCKAUTO = 0x0001
    Global Const $GUI_DOCKLEFT = 0x0002
    Global Const $GUI_DOCKRIGHT = 0x0004
    Global Const $GUI_DOCKHCENTER = 0x0008
    Global Const $GUI_DOCKTOP = 0x0020
    Global Const $GUI_DOCKBOTTOM = 0x0040
    Global Const $GUI_DOCKVCENTER = 0x0080
    Global Const $GUI_DOCKWIDTH = 0x0100
    Global Const $GUI_DOCKHEIGHT = 0x0200

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

    Global Const $GUI_DOCKSIZE = 0x0300 ; width+height
    Global Const $GUI_DOCKMENUBAR = 0x0220 ; top+height
    Global Const $GUI_DOCKSTATEBAR = 0x0240 ; bottom+height
    Global Const $GUI_DOCKALL = 0x0322 ; left+top+width+height
    Global Const $GUI_DOCKBORDERS = 0x0066 ; left+top+right+bottom

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

    ; Graphic
    Global Const $GUI_GR_CLOSE = 1
    Global Const $GUI_GR_LINE = 2
    Global Const $GUI_GR_BEZIER = 4
    Global Const $GUI_GR_MOVE = 6
    Global Const $GUI_GR_COLOR = 8
    Global Const $GUI_GR_RECT = 10
    Global Const $GUI_GR_ELLIPSE = 12
    Global Const $GUI_GR_PIE = 14
    Global Const $GUI_GR_DOT = 16
    Global Const $GUI_GR_PIXEL = 18
    Global Const $GUI_GR_HINT = 20
    Global Const $GUI_GR_REFRESH = 22
    Global Const $GUI_GR_PENSIZE = 24
    Global Const $GUI_GR_NOBKCOLOR = -2

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

    ; Background color special flags
    Global Const $GUI_BKCOLOR_DEFAULT = -1
    Global Const $GUI_BKCOLOR_TRANSPARENT = -2
    Global Const $GUI_BKCOLOR_LV_ALTERNATE = 0xFE000000

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

    ; Other
    Global Const $GUI_WS_EX_PARENTDRAG = 0x00100000
    ; ===============================================================================================================================

    [/autoit]


    Die Namen dürften alles erklären ;)

  • Hallo Alina,

    Um das ganze mal aufzuklären: Das -3 habe ich mit GUISetOnEvent benutzt, nicht GUICtrlSetOnEvent.

    [autoit]

    GUISetOnEvent ( specialID, "function" [, winhandle] )

    [/autoit]

    Die -3 ist in diesem Fall eine specialID und steht für $GUI_EVENT_CLOSE. Die Werte der einzelnen "Event"-Konstanten findet man in GUIConstantsEx.au3

    Spoiler anzeigen
    [autoit]

    ; Events and messages
    Global Const $GUI_EVENT_CLOSE = -3
    Global Const $GUI_EVENT_MINIMIZE = -4
    Global Const $GUI_EVENT_RESTORE = -5
    Global Const $GUI_EVENT_MAXIMIZE = -6
    Global Const $GUI_EVENT_PRIMARYDOWN = -7
    Global Const $GUI_EVENT_PRIMARYUP = -8
    Global Const $GUI_EVENT_SECONDARYDOWN = -9
    Global Const $GUI_EVENT_SECONDARYUP = -10
    Global Const $GUI_EVENT_MOUSEMOVE = -11
    Global Const $GUI_EVENT_RESIZED = -12
    Global Const $GUI_EVENT_DROPPED = -13

    [/autoit]

    Zu der -1: Wenn man sie als ControlID verwendet, bezieht sich die Funktion (Zum Beispiel GUICtrlSetOnEvent) auf das zuletzt erstellte Control

    Und -2 gibts weder als Control ID, noch als Event. Aber als Farbcode :P
    Und zwar ist -2 eine transparente Farbe, die du zum Beispiel als Hintergrundfarbe eines Labels benutzen kannst

    Spoiler anzeigen
    [autoit]

    HotKeySet("{ESC}","_Exit")
    $hGUI = GUICreate("", 240, 50)
    GUISetBkColor(0x00FFFF)
    GUICtrlCreateLabel("Ich bin ein Label", 20, 20, 200, 20)
    GUISetState()

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

    While 1
    GUICtrlSetBkColor(-1, 0xFF0000)
    Sleep(1000)
    GUICtrlSetBkColor(-1, -2)
    Sleep(1000)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]
  • Macht unnötig CPU Last besser ist

    [autoit]

    While Sleep(50)
    WEnd

    [/autoit]

    Falsch,

    Zitat von Hilfe zu GiGetMsg

    Bemerkungen

    Diese Funktion gibt die CPU automatisch wieder frei, wenn es erforderlich ist, so dass sie ruhig in Dauerschleifen benutzt werden kann, ohne die CPU vollständig auszulasten

    @Inferior, das ganze geht auch im Msg-Loop Modus, du darfst die Controls nur aktalisieren wenn nötig ;

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEX.au3>
    #include <EditConstants.au3>

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

    $main = GUICreate("Test", 150, 100)
    $checkbox = GUICtrlCreateCheckbox("test", 20, 30)
    $input = GUICtrlCreateInput("0", 80, 30, 40, 20, $ES_NUMBER)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $updown1 = GUICtrlCreateUpdown($input)
    GUICtrlSetLimit(-1, 100, 0)

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

    GUISetState()

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

    While 1

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

    $main = GUIGetMsg()
    Switch $main
    Case $checkbox
    If GUICtrlRead($checkbox) = $GUI_CHECKED Then
    GUICtrlSetState($input, $GUI_ENABLE)
    Else
    GUICtrlSetData($input, "")
    GUICtrlSetState($input, $GUI_DISABLE)
    EndIf
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    bei grösseren Skripten rate ich dir allerdings auch zum On-Event Modus

    Ps.: In diesem Thread sind viele falsche (bzw. sehr leicht falsch auszulegende) Posts, ich möchte nicht korrigieren aber vielleicht editiert ja der ein(e) oder andere (Power)-User seinen Beitrag oder ein Mod ( Oscar ) KORRIGIERT alles (Mir ist nach einer anstrengenden Woche nd er dazugehörigen Absch(l)ussfeier nicht danach

    mfg (Auto)Bert

  • @Inferor und @money: Die Lösung von monkey hat leider den Nachteil, dass immer geprüft wird. Dadurch verlangsamt sich nicht nur das Script und die CPU steigt hoch, sondern das kann bei lahmeren Systemen auch zu Flackern führen, was optisch nicht gerade anregend ist . Würde eher das von Sprenger und mir oder das von Seubo empfehlen! Oder natürlich das von Autobert (gerade erst gelesen), was die einfachste Methode zu sein scheint (musst nich soviel umstellen)

    Mit Opt("GuiOnEventMode", 1) kannst du den On-Event-Mode anschlaten, mit Opt("GuiOnEventMode", 0) ihn wieder abstellen.