ComboBox in Schleife auslesen

  • Hallo miteinander,

    in meinem Script verwende ich eine ComboBox, um bestimmte Controls ein- bzw. auszublenden.

    Derzeit realisiere ich es so, dass die ComboBox ausgelesen wird, wenn man einen Button drückt. Wird dann Wert XYZ gelesen blendet er halt Control 1 aus und blendet stattdessen Control 2 ein.

    Das funktioniert soweit alles wunderbar.

    Nun habe ich versucht, die Abfrage der ComboBox in die While Schleife zu packen (um von dem Button wegzukommen). Problem was dabei entstand, war natürlich, dass die entsprechenden Controls nun anfingen zu flackern, da das auslesen und Hide/Show nun dauerhaft liefen.

    Ich habe ein wenig in der Hilfe gestöbert und konnte dabei noch einen Befehl entdecken, der den Status der Combobox abfragt, ob diese geöffnet oder geschlossen ist. Nun habe ich die Whileschleife dahingehend angepasst, dass er nur die Combobox ausliesst, wenn sie geöffnet ist.

    Aber öffne ich jetzt die Combobox nur zum Spass ohne dabei was zu ändern/auszuwählen, fängt die GUI natürlich wieder an zu flackern.

    Gibt es nicht eine elegante Möglichkeit, eine ComboBox einzubauen und diese mit einer Schleife abzufragen, ohne das über einen Button realisieren zu müssen?

    Hier mal ein Teil meines Codes wo man aktuell gerade den Button erkennt, aber auch die Abfrage bereits in der Schleife (wo es abe noch flackert, wenn die ComboBox geöffnet wird)

    Spoiler anzeigen
    [autoit]


    While Sleep(10)

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

    If _GUICtrlComboBox_GetDroppedState($combo) Then
    $read_combo = GUICtrlRead($combo)
    If $read_combo = "Kontaktliste" Then
    _KONTAKTLISTE()
    ElseIf $read_combo = "Linkliste" Then
    _LINKLISTE()
    ElseIf $read_combo = "FSM 7.15" Then
    _FSM()
    ElseIf $read_combo = "GSMW v2/3/4" Then
    _GSMW()
    ElseIf $read_combo = "CT Knowlegde" Then
    _CTKNOWLEDGE()
    EndIf
    EndIf

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

    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $combo_button
    $read_combo = GUICtrlRead($combo)
    If $read_combo = "Kontaktliste" Then
    _KONTAKTLISTE()
    ElseIf $read_combo = "Linkliste" Then
    _LINKLISTE()
    ElseIf $read_combo = "FSM 7.15" Then
    _FSM()
    ElseIf $read_combo = "GSMW v2/3/4" Then
    _GSMW()
    ElseIf $read_combo = "CT Knowlegde" Then
    _CTKNOWLEDGE()
    EndIf
    Case $button1
    _KONTAKTLISTE_BUTTON()
    Case $button2
    _LINKLISTE_BUTTON()
    Case $button3
    _FSM_BUTTON()
    Case $button4
    _GSMW_BUTTON()
    Case $button5
    _CTKNOWLEDGE_BUTTON()
    EndSwitch
    WEnd

    [/autoit]

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

    Einmal editiert, zuletzt von mirko2002 (18. März 2012 um 21:48) aus folgendem Grund: Status auf "gelöst" gesetzt

  • Hi,

    mit dem On-Event-Mode sollte sich dein Problem lösen lassen:

    Beispiel
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)
    $hGui = GUICreate("Gui", 615, 438, 192, 124)
    $cCombo = GUICtrlCreateCombo("Bitte ein Element auswählen", 120, 56, 153, 25)
    GUICtrlSetData(-1, "Text1|Text2|Text3")
    GUICtrlSetOnEvent(-1, "ComboTextChange")
    GUISetOnEvent($GUI_EVENT_CLOSE, "ende")
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(10)
    WEnd

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

    Func ComboTextChange()
    MsgBox(0, "Neues Element ausgewählt", GUICtrlRead($cCombo))
    EndFunc ;==>ComboTextChange

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

    Func ende()
    Exit
    EndFunc ;==>ende

    [/autoit]

    Gruß stay

  • Hm ok damit gehts,

    aber gibt es auf eine Methode ohne On-Event-Mode?

    Hab mein Script derzeit komplett auf GuigetMsg geschrieben und müsste so wieder alles abändern... aber wahrscheinlich müsste ich damit leben oder?

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Speicher doch einfach den aktuellen Text der ComboBox in ner Var und ruf die Funktion zum show/hide nur auf wenn der aktuelle Text jetzt nen anderer is.
    Musst dann natürlich immer noch die Var auf den aktuellen setzen bei change

    So in der Art quasi:

    Spoiler anzeigen
    [autoit]

    While Sleep(10)

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

    If _GUICtrlComboBox_GetDroppedState($combo) Then
    $read_combo = GUICtrlRead($combo)
    if $aktText <> $read_combo Then
    If $read_combo = "Kontaktliste" Then
    _KONTAKTLISTE()
    ElseIf $read_combo = "Linkliste" Then
    _LINKLISTE()
    ElseIf $read_combo = "FSM 7.15" Then
    _FSM()
    ElseIf $read_combo = "GSMW v2/3/4" Then
    _GSMW()
    ElseIf $read_combo = "CT Knowlegde" Then
    _CTKNOWLEDGE()
    EndIf
    $aktText = $read_combo
    EndIf
    EndIf

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

    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $combo_button
    $read_combo = GUICtrlRead($combo)
    If $read_combo = "Kontaktliste" Then
    _KONTAKTLISTE()
    ElseIf $read_combo = "Linkliste" Then
    _LINKLISTE()
    ElseIf $read_combo = "FSM 7.15" Then
    _FSM()
    ElseIf $read_combo = "GSMW v2/3/4" Then
    _GSMW()
    ElseIf $read_combo = "CT Knowlegde" Then
    _CTKNOWLEDGE()
    EndIf
    Case $button1
    _KONTAKTLISTE_BUTTON()
    Case $button2
    _LINKLISTE_BUTTON()
    Case $button3
    _FSM_BUTTON()
    Case $button4
    _GSMW_BUTTON()
    Case $button5
    _CTKNOWLEDGE_BUTTON()
    EndSwitch
    WEnd

    [/autoit]
  • Hm... warum bin ich da nicht eher drauf gekommen ^^

    So gehts.

    Kann man das evtl noch verfeinern? Jetzt funktioniert es soweit, dass das DropDown Menü aufklappt und er es aktualisiert, sobald man mit der Maus über einen anderen Eintrag drüber fährt - ohne das ich ihn schon angeklickt habe. Geht das aktualisieren auch erst nach dem Mausklick? Ich mein, das ist jetzt kein Weltuntergang, dass er es schon vorher aktualisiert - aber schöner wär's natürlich trotzdem, dass er es erst durchführt wenn auch wirklich draufgeklickt wurde.

    Habe in der Hilfe keine Funktion dafür finden können oder ich hab falsch gesucht.

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Moin,

    auch wenn Du diesen Part herausnimmst ?

    Spoiler anzeigen
    [autoit]

    If _GUICtrlComboBox_GetDroppedState($combo) Then
    $read_combo = GUICtrlRead($combo)
    if $aktText <> $read_combo Then
    If $read_combo = "Kontaktliste" Then
    _KONTAKTLISTE()
    ElseIf $read_combo = "Linkliste" Then
    _LINKLISTE()
    ElseIf $read_combo = "FSM 7.15" Then
    _FSM()
    ElseIf $read_combo = "GSMW v2/3/4" Then
    _GSMW()
    ElseIf $read_combo = "CT Knowlegde" Then
    _CTKNOWLEDGE()
    EndIf
    $aktText = $read_combo
    EndIf
    EndIf

    [/autoit]


    Gruß
    Greenhorn


  • Ich meinte so:

    [autoit]

    $hwnd = GUICreate ("Test")
    $combo = GUICtrlCreateCombo ("item1", 10, 10)
    GUICtrlSetData(-1, "item2|item3", "item3")

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

    GUISetState (@SW_SHOW, $hwnd)

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

    While (TRUE)

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

    Switch (GUIGetMsg ( ))
    case $combo
    MsgBox (0, "ComboBox", GUICtrlRead ($combo))
    EndSwitch
    WEnd

    [/autoit]


    Gruß
    Greenhorn