"Mehrere ComboBox-Controls, selbe Liste?" & "ComboBox: Einzelne Einträge deaktivieren?"

  • Hallo Community,

    folgendes Problem wurde bisher scheinbar noch nicht behandelt:

    Mehrere ComboBox-Controls bieten dieselben Einträge (in einem 1-D-Array zu finden) zur Auswahl an.

    Wurde ein Eintrag in einem Control gewählt, soll er in den anderen Controls nicht mehr zur Auswahl stehen.
    Wird ein ausgewählter Eintrag durch eine andere Auswahl ersetzt, soll er wieder in allen Controls zur Auswahl zur Verfügung stehen.

    Meine Fragen daher:

    • Ist es möglich einzelne Einträge einer ComboBox "anzusprechen" (u. U. mit dem Status [autoit]$GUI_DISABLE[/autoit])?
    • Sind einfachere Möglichkeiten (vielleicht mithilfe der in AutoIt vorhandenen ComboBox-UDF-Funktionen) zur Lösung des Problems möglich, als ein Array mit den Inhalten aller Controls zu deklarieren, zu aktualisieren und entsprechend alle Controls vollständig zu updaten (d. h. alte Liste löschen, neue (veränderte) Liste einfügen, alten Default einfügen)?

    Vielen Dank!

  • Codebeispiel für die Problematik
    [autoit]

    #include-once
    #include <GUIConstants.au3>

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

    Global $aGUI[4], $aInhalt[3] = ["Inhalt 1", "Inhalt 2", "Inhalt 3"];hier folgen (in $aInhalt) weitere Inhalte

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

    $aGUI[0] = GUICreate("ComboBox-Problematik")
    $aGUI[1] = GUICtrlCreateCombo("Box 1", 5, 5, 75, 25)
    $aGUI[2] = GUICtrlCreateCombo("Box 2", 5, 30, 75, 25)
    ;hier folgen weitere ComboBox-Controls (daher im folgenden allgemeine Schreibweisen)
    GUISetState(@SW_SHOW)

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

    For $i_1 = 1 To 2;s. Kommentar oben
    For $i_2 = 0 To UBound($aInhalt)-1
    GUICtrlSetData($aGUI[$i_1], $aInhalt[$i_2])
    Next
    Next

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $aGUI[1] To $aGUI[2];s. Kommentar oben
    _ComboBoxUpdate ()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _ComboBoxUpdate ();diese Funktion soll optimiert werden

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

    EndFunc

    [/autoit]


    Die Problematik innerhalb dieses Beispiels stellt sich wie folgt dar:
    Ist in Control1 Inhalt1 ausgewählt, soll dieser in Control2 nicht mehr zur Auswahl stehen (bis in Control1 ein anderer Inhalt ausgewählt wird); ebenso soll es sich mit Control2 bzw. anderen Inhalten und weiteren Controls verhalten, weshalb ich an einer möglichst allgemeinen Lösung interessiert bin.

    • Offizieller Beitrag

    Habe das Beispiel mal erweitert, um das besser testen zu können. Ich denke mal, Du meinst sowas:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    Global $aCombo[4], $aInhalt[9] = ["Default", "Inhalt 1", "Inhalt 2", "Inhalt 3", "Inhalt 4", "Inhalt 5", "Inhalt 6", "Inhalt 7", "Inhalt 8"];hier folgen (in $aInhalt) weitere Inhalte

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

    $hGui = GUICreate("ComboBox-Problematik")
    $aCombo[0] = GUICtrlCreateCombo("Box 1", 5, 10, 75, 25)
    $aCombo[1] = GUICtrlCreateCombo("Box 2", 5, 40, 75, 25)
    $aCombo[2] = GUICtrlCreateCombo("Box 2", 5, 70, 75, 25)
    $aCombo[3] = GUICtrlCreateCombo("Box 2", 5, 100, 75, 25)
    ;hier folgen weitere ComboBox-Controls (daher im folgenden allgemeine Schreibweisen)
    GUISetState(@SW_SHOW)

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

    Global $sComboDefault = ''
    For $i = 0 To UBound($aInhalt) - 1
    $sComboDefault &= $aInhalt[$i] & '|'
    Next
    $sComboDefault = StringTrimRight($sComboDefault, 1)
    _SetComboStart($sComboDefault, $aInhalt[0])

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $aCombo[0] To $aCombo[UBound($aCombo)-1];s. Kommentar oben
    _ComboBoxUpdate($msg)
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _ComboBoxUpdate($msg);diese Funktion soll optimiert werden
    Local $sValue, $sDefault, $sComboTmp
    For $i = 0 To UBound($aCombo) - 1
    $sComboTmp = $sComboDefault & '|'
    For $j = 0 To UBound($aCombo) - 1
    If $i <> $j Then
    $sValue = GUICtrlRead($aCombo[$j])
    If $sValue <> $aInhalt[0] Then $sComboTmp = StringReplace($sComboTmp, $sValue & '|', '', 1)
    EndIf
    Next
    $sComboTmp = StringTrimRight($sComboTmp, 1)
    $sDefault = GUICtrlRead($aCombo[$i])
    GUICtrlSetData($aCombo[$i], '')
    GUICtrlSetData($aCombo[$i], $sComboTmp, $sDefault)
    Next
    EndFunc ;==>_ComboBoxUpdate

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

    Func _SetComboStart($sText, $sDefault)
    For $i = 0 To UBound($aCombo) - 1
    GUICtrlSetData($aCombo[$i], '')
    GUICtrlSetData($aCombo[$i], $sText, $sDefault)
    Next
    EndFunc ;==>_SetComboStart

    [/autoit]