Comboeinträge mit $WM_COMMAND

  • Guten abend Leute,

    ich habe ein Problem und zwar möchte ich mit einer Combobox "live" die Einträge ändern lassen, nur werden die Einträge zu oft eingetragen. Weiß einer warum das so ist bzw. wo liegt der Fehler?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <ComboConstants.au3>

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

    GUICreate("Test", 300, 300)

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

    $combo = GUICtrlCreateCombo("Test", 10, 10, 200, 25, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, "Test 2|Test 3")
    $combo_2 = GUICtrlCreateCombo("", 10, 50, 200, 25, $CBS_DROPDOWNLIST)
    $combo_3 = GUICtrlCreateCombo("", 10, 90, 200, 25, $CBS_DROPDOWNLIST)

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

    GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()

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

    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _WM_COMMAND()
    If GUICtrlRead($combo) = "Test" Then
    GUICtrlSetData($combo_2, "Combo|Combo 2|Combo 3|Combo 4")
    GUICtrlSetData($combo_3, "Benutzer|Benutzer 2|Benutzer 3|Benutzer 4")
    ElseIf GUICtrlRead($combo) = "Test 2" Then
    GUICtrlSetData($combo_2, "Auto|Auto 2|Auto 3|Auto 4")
    GUICtrlSetData($combo_3, "User|User 2|User 3|User 4")
    Else
    GUICtrlSetData($combo_2, "PC|PC 2|PC 3|PC 4")
    GUICtrlSetData($combo_3, "Notebook|Notebook 2|Notebook 3|Notebook 4")
    EndIf
    EndFunc

    [/autoit]
  • WM_COMMAND wird öfter als nur einmal aufgerufen wenn die Gui erstellt wird. So sollte es aber klappen.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <ComboConstants.au3>

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

    GUICreate("Test", 300, 300)

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

    $combo = GUICtrlCreateCombo("Test", 10, 10, 200, 25, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, "Test 2|Test 3")
    $combo_2 = GUICtrlCreateCombo("", 10, 50, 200, 25, $CBS_DROPDOWNLIST)
    $combo_3 = GUICtrlCreateCombo("", 10, 90, 200, 25, $CBS_DROPDOWNLIST)

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

    GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()

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

    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _WM_COMMAND()
    If GUICtrlRead($combo) = "Test" Then
    GUICtrlSetData($combo_2, "|Combo|Combo 2|Combo 3|Combo 4")
    GUICtrlSetData($combo_3, "|Benutzer|Benutzer 2|Benutzer 3|Benutzer 4")
    ElseIf GUICtrlRead($combo) = "Test 2" Then
    GUICtrlSetData($combo_2, "|Auto|Auto 2|Auto 3|Auto 4")
    GUICtrlSetData($combo_3, "|User|User 2|User 3|User 4")
    Else
    GUICtrlSetData($combo_2, "|PC|PC 2|PC 3|PC 4")
    GUICtrlSetData($combo_3, "|Notebook|Notebook 2|Notebook 3|Notebook 4")
    EndIf
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Und damit man in den anderen Comboboxen auch etwas auswählen kann, sollte man eine Abfrage einfügen:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <ComboConstants.au3>

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

    GUICreate("Test", 300, 300)

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

    $combo = GUICtrlCreateCombo("Test", 10, 10, 200, 25, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, "Test 2|Test 3")
    $combo_2 = GUICtrlCreateCombo("", 10, 50, 200, 25, $CBS_DROPDOWNLIST)
    $combo_3 = GUICtrlCreateCombo("", 10, 90, 200, 25, $CBS_DROPDOWNLIST)

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

    GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()

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

    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nID = BitAND($wParam, 0x0000FFFF)
    If $nID = $combo Then
    If GUICtrlRead($combo) = "Test" Then
    GUICtrlSetData($combo_2, "|Combo|Combo 2|Combo 3|Combo 4")
    GUICtrlSetData($combo_3, "|Benutzer|Benutzer 2|Benutzer 3|Benutzer 4")
    ElseIf GUICtrlRead($combo) = "Test 2" Then
    GUICtrlSetData($combo_2, "|Auto|Auto 2|Auto 3|Auto 4")
    GUICtrlSetData($combo_3, "|User|User 2|User 3|User 4")
    Else
    GUICtrlSetData($combo_2, "|PC|PC 2|PC 3|PC 4")
    GUICtrlSetData($combo_3, "|Notebook|Notebook 2|Notebook 3|Notebook 4")
    EndIf
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]
  • Danke euch beiden. :)

    Oscar , kannst du mir nochmal das genauer erklären, was dort gemacht wird?

    [autoit]

    Local $nID = BitAND($wParam, 0x0000FFFF)

    [/autoit]
    • Offizieller Beitrag

    Wenn die Funktion aufgerufen wird, wird in der Übergabe-Variable $wParam im LoWord die ID des angeklickten GUI-Control-Elements übergeben. Da im HiWord der Notification-Code übergeben wird, muss man diesen ausmaskieren. Das geschieht mit BitAND($wParam, 0x0000FFFF). So bleibt nur der Wert des LoWords über und den kann man dann mit der ID des GUI-Elements (hier der Combobox) vergleichen.