zwei ComboBox voneinander abhängig gestalten

  • Hallo zusammen,
    habe folgendes vor und weiß noch nicht wie ich das realisieren kann.

    Zuerst lese ich eine Datei und mit _StringBetween zwischen zwei Werten Einträge aus und bekomme folgendes heraus:

    Die Datei variiert natürlich mit anderen Werten und Einträgen.

    Jetzt wollte ich mir nach dem auslesen ein Fenster aufbauen was in etwa so aussieht:

    Code
    Global $AuswahlFenster = GUICreate("Funktionswahl", 300, 130)
    Global $Label = GUICtrlCreateLabel("Bitte eine Auswahl treffen und auf weiter klicken", 15, 50, 280)
    Global $idComboBoxSprache = GUICtrlCreateCombo("Wähle eine Sprache", 10, 20, 280, 20)
    Global $idComboBoxFunktion = GUICtrlCreateCombo("Wähle eine Funktion", 10, 50, 280, 20)
    Global $Close = GUICtrlCreateButton("Beenden", 205, 100, 85, 25)
    Global $idWeiter = GUICtrlCreateButton("Weiter", 10, 100, 85, 25)

    Sowas einfaches wie GUICtrlSetData($idComboBoxSprache, $SpracheGefiltert[i$]) würde ich hinkriegen. Und auch die zweite ComboBox so zu befüllen krieg ich hin.

    Wie mache ich aber beide Felder voneinander abhängig?

    Wenn ich z.B. deutsch auswähle, dann soll er mir in der zweiten ComboBox nur die Einträge die unter deutsch auch zwischen <option value="EIN">...</option> stehen anzeigen und wenn ich die Sprache und dann eine Funktion wähle und auf weiter klicke, dann soll er aber den Wert, der in value steht weitergeben?

    Kenne mich leider nicht so gut mit 2D Arrays aus oder was dazu nötig wäre.

    Bin jetzt schon dankbar für eure Hilfe!

    • Offizieller Beitrag

    Du solltest schon ein minimales , lauffähiges Skript bereit stellen. Niemand hat Lust jetzt selbst eine Gui mit Combos zu basteln.

    - stelle das Skript bereit

    - stelle Musterdaten bereit

    z.B. $sDataBox1 = ..... / $sDataBox2 = .....

    Dann kann man auch aufzeigen, wie das umzusetzen ist.

  • Mein Problem ist ja, dass ich nicht weiß wie ich vorgehen soll.

    Ich krieg lediglich das hier zusammen:

  • Mein Problem ist ja, dass ich nicht weiß wie ich vorgehen soll.

    Hier auf die Schnelle ein Beispiel ohne großartiges Errorhandling. Geht sicher eleganter, aber ggf. schon mal ein Anfang ;).

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Danke Musashi für deine Mühe!

    Leider kam ich damit nicht zurecht.

    Hab nach langem rumprobieren es irgendwie hinbekommen. Kann man mit Sicherheit irgendwie einfacher und schöner machen.

    Aber so in etwa habe ich mir das vorgestellt:

    Vielleicht geht es irgendwie einfacher oder besser um es auch besser zu übersehen?

  • Hallo turbobaby

    Mein Tipp wäre einfach die Controls und die Daten noch stärker zu trennen. Packe die Verarbeitung von $SuchText in eine Funktion, die immer den Quelltext bekommt und dir die Daten ausspuckt, die du für deine Controls brauchst und zwar genau so, dass du die Combobox direkt füllen kannst.

    Case $idComboBoxSprache Hier sollte dann wirklich nur noch die gewählte Sprache ermittelt werden und das Control mit dem bereits fertigen Text gefüllt werden.
    Mit fortschreitenden Fähigkeiten oder bei geändertem Quelltext kannst du dann immer in dieser Funktion rumwerkeln und hast nicht noch bei der Auswertung Fehlerquellen.

    Grüße autoiter

    • Offizieller Beitrag

    Hier mal meine Lösung.

    Es wird ein Array erstellt mit "Sprache" an [1...n][0] und an [0][0] der ComboString.

    Das zugehörige Array mit [[ComboString],[Wert1,Inhalt],[Wert2,Inhalt],..] wird an [1...n][1] gespeichert.

    Sieht vielleicht etwas verwirrend aus, ist aber effektiv. ;)

    • Offizieller Beitrag

    Kannst du mir erklären was/wie genau hier gefiltert wird?

    '^(\w+)</option>'

    '<option value="([^"]+)">([^<]+)<\/option>'

    Ich hatte als erstes gesplittet, danach liegt für jede Sprache eine String vor, der mit "deutsch</option><option value="EINS">1 h....." beginnt.

    Das Pattern '^(\w+)</option>' bedeutet folgendes:

    ^ - starte Suche am Stringanfang

    () - in Klammern, hier wird das Ergebnis enthalten sein - Capturing Group

    \w - jedes Wortzeichen (a-z), alle Ziffern und Unterstrich

    + - einmal bis beliebige Anzahl

    diesem Ausdruck muss </option> folgen.

    Das nächste Pattern selektiert Wert und zugehörigen Inhalt.

    <option value=" - damit wird die Suche eingeleitet

    ([^"]+) - Klammern zum Auffangen des Ergebnisses, eckige Klammern: Gruppe von Zeichen, hier ^" bedeutet alles ausser ", + s.o.

    "> - diese Zeichen müssen folgen

    ([^<]+) - wieder Capturing group, gesucht wird alles ausser <

    gefolgt von <\/option>

  • BugFix

    Sorry für die Belästigung, hab da leider doch noch zwei Fragen.

    $aValues[1][2] = [[0]]
    Kannst du mir diese Array Deklaration noch erklären?

    Local $sFillComboVal = ($aLang[$iLangIndex][1])[0][0]

    Wie wird hier gewählt, da blick ich noch nicht durch?

    Danke vorab!

    • Offizieller Beitrag

    Local $aValues[1][2] = [[0]] deklariert ein Array mit einem Element und 2 Spalten. Gleichzeitig wird $aValues[0][0] der Wert "0" zugewiesen (schau mal in mein Array-Tut, s. Signatur).

    Local $sFillComboVal = ($aLang[$iLangIndex][1])[0][0]

    $aLang[$iLangIndex][1] enthält wiederunm ein 2D-Array. Auf dessen Element [0][0] möchte ich zugreifen, dort ist der String zum direkten Befüllen der Combo gespeichert.

    Man könnte das so tun:

    $inneresArray = $aLang[$iLangIndex][1]

    Local $sFillComboVal = $inneresArray[0][0]

    oder mit etwas syntactic sugar spart man sich die extra Variable, covert das Array durch die runden Klammern und kann dann direkt mit den eckigen Klammern den Zugriff auf das innere Array durchführen.

  • Hallo nochmal!

    Ich habe da jetzt folgendes Problem:

    Habe immer unterschiedlichen Text mit Teilweise zwischen Anmerkungen.

    Jetzt muss ich die Anmerkungen aber herauslöschen.

    Die sind immer in folgenden Klammern hinterlegt:

    Code
    <span class="..."> pla pla pla diesen Text löschen <hier kann auch was stehen was gelöscht werden muss></span>2 pla pla pla diesen Text behalten!"pla pla pla"<span class="..."> pla pla pla so wie hier auch alles löschen, dies ist eine Anmerkung</span> usw.

    Jetzt möchte ich die Texte von <span bis </span> komplett herauslöschen.

    Hab da schon verschiedene Methoden ausprobiert, klappt aber alles nicht. Irgendwie klappt es bei mir noch nicht so ganz mit dem filtern.

    Code
    $TextFinden[$i] = StringReplace($TextFinden[$i], '<span(.*?)</span>', '')

    Was mache ich da falsch?