Comboboxen mit Abhänigkeiten

  • Hallo zusammen,

    ich tue mich gerade bei einer simplen Aufgabe etwas schwer.
    Habe bisher nur einfache Installationsskripte gebastelt daher komme ich jetzt etwas ins stocken.

    Ziel:
    Eine kleine GUI in der sich die User über comboboxen zur Installation eines Netzwerkdruckers hangeln können.
    Das ganze sieht bisher so aus:

    [Blockierte Grafik: http://www.abload.de/thumb/zwischenablage01gnu6x.jpg]


    Problem:


    Ich habe eine txt Datei mit folgenem Aufbau:

    Druckername {tab} Gebäude {tab} Etage {tab} Raum (Reihenfolge kann auch geändert werden)


    z.B.

    Zitat


    SPC232SF-001-PS A01 EG R. 031
    P7527N-395-PS A02 2OG R. 219

    Wenn der User nun zb. das Gebäude A01 wählt, sollen in der nächsten Combobox nur noch alle Etagen von A01 auftauchen,
    nach Auswahl der Etage nur noch die Räume dieser Etage und letztendlich der Drucker der in dem jeweiligen Raum steht.

    (Optional wäre auch schön wenn man das Gebäude wählt und alle Drucker angezeigt werden, ohne die Auswahl der Etage/des Raums auszuwählen)

    Ich gehe mal davon aus das sich das mit Arrays lösen lässt, nur sehe ich da noch nicht die Möglichkeit die Abhängigkeiten einzubauen.

    Danke schonmal für eure Hilfe!!!

  • Hallo Der_Eismann,

    dies ist relatov einfach zu lösen

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include<Array.au3>
    #include<File.au3>

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

    Dim $aTmp[1]
    _FileReadToArray(@ScriptDir & "\Drucker.txt",$aTmp)
    Global $aDrucker[$aTmp[0]+1][4]

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

    For $i = 1 to $aTmp[0]
    $aSplit = StringSplit($aTmp[$i],"|")
    for $j = 1 to $aSplit[0]
    $aDrucker[$i][$j-1] = $aSplit[$j]
    Next
    Next
    $aDrucker[0][0] = $aTmp[0]

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

    $sYourChoice = "Bitte wählen"

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

    Global $sGeb, $sEtage

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

    $hGui = GUICreate("Druckerauswahl",240,120)
    $idCboGeb = GUICtrlCreateCombo("",5,5,230)
    _GetGeb()
    $idCboEtage = GUICtrlCreateCombo("",5,35,230)
    $idCboRaeume = GUICtrlCreateCombo("",5,65,230)
    GUISetState()

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

    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idCboGeb
    $sGeb = GUICtrlRead($idCboGeb)
    if $sGeb <> $sYourChoice Then
    _GetEtage($sGeb)
    if $sGeb ="alle" Then
    GUICtrlSetData($idCboEtage,"alle","alle")
    _GetRaeume($sGeb,"alle")
    EndIf
    EndIf
    Case $idCboEtage
    $sEtage = GUICtrlRead($idCboEtage)
    if $sEtage <> $sYourChoice Then _GetRaeume($sGeb,$sEtage)
    EndSwitch
    WEnd

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

    Func _GetGeb()
    Local $aGeb[1]
    GUICtrlSetData($idCboGeb,"")
    GUICtrlSetData($idCboGeb,$sYourChoice,$sYourChoice)
    GUICtrlSetData($idCboGeb,"alle")
    for $i = 1 To $aDrucker[0][0]
    _ArrayAdd($aGeb,$aDrucker[$i][1])
    Next
    $aGeb = _ArrayUnique($aGeb)
    for $i =1 to $aGeb[0]
    if $aGeb[$i] <> "" Then GUICtrlSetData($idCboGeb,$aGeb[$i])
    Next
    EndFunc

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

    Func _GetEtage($sGeb)
    Local $aEtage[1]
    GUICtrlSetData($idCboEtage,"")
    GUICtrlSetData($idCboEtage,$sYourChoice,$sYourChoice)
    GUICtrlSetData($idCboEtage,"alle")
    for $i = 1 To $aDrucker[0][0]
    if $sGeb = $aDrucker[$i][1] Then
    _ArrayAdd($aEtage,$aDrucker[$i][2])
    EndIf
    Next
    $aEtage = _ArrayUnique($aEtage)
    for $i =1 to $aEtage[0]
    if $aEtage[$i] <> "" Then GUICtrlSetData($idCboEtage,$aEtage[$i])
    Next
    EndFunc

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

    Func _GetRaeume($sGeb,$sEtage)
    Local $aRaeume[1]
    GUICtrlSetData($idCboRaeume,"")
    GUICtrlSetData($idCboRaeume,$sYourChoice,$sYourChoice)
    for $i = 1 To $aDrucker[0][0]
    if (($sGeb = $aDrucker[$i][1]) or ($sGeb = "alle")) And (($sEtage = $aDrucker[$i][2]) or ($sEtage = "alle")) Then
    _ArrayAdd($aRaeume,$aDrucker[$i][3])
    EndIf
    Next
    $aRaeume = _ArrayUnique($aRaeume)
    for $i =1 to $aRaeume[0]
    if $aRaeume[$i] <> "" Then GUICtrlSetData($idCboRaeume,$aRaeume[$i])
    Next
    EndFunc

    [/autoit]

    das ganze habe ich mit folgenden Testdaten getestet: Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    mfg autoBert

  • dies ist relatov einfach zu lösen

    ja ne ist klar ;)

    DANKE!!

    hab jetzt etwas gebraucht das ganze zu verstehen aber jetzt läuft das ganze so wie ich mir das vorgestellt habe.
    Du hast ja extra die Auswahl des Druckers weggelassen, damit ich noch etwas Transferleistung einbringen musste ;)

    Kannst ja gerne nochmal drüberschauen ob ich keinen Fehler drin habe.
    Für alle anderen die was ähnliches vorhaben, habe ich den Quelltext mal angehangen!

    # EDIT #
    Wie kann ich denn die Ausgabe der Drucker noch sortieren?

  • Hallo Der_Eismann,

    um das Array zu sortieren fügst du einfach

    [autoit]

    _ArraySort($aPrinter)

    [/autoit]

    direkt vor dem Einfügen in die ComboBox hinzu. Da dein Textfile anscheinend etwas anders aufgebaut ist als meine Drucker.txt solltest du die Datei an deinen Lösungspost noch mit anhängen. Mit meiner Datei bekomme ich wenn ich überall "alle" anwähle keinen einzigen Drucker zur Auswahl angeboten,

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (3. Februar 2012 um 16:54)

  • Habe das mein Textfile mal angehägt.

    Wo genau muss das

    [autoit]

    _ArraySort($aPrinter)

    [/autoit]

    denn hin?