![]() |
Zuweisen einer TStringList zu mehreren TComboBoxen
Hallo Community
vllt. könnt Ihr mir helfen: In meiner Form erzeuge ich zur Laufzeit mehrere TComboBoxen, welche alle mit der gleichen Stringliste befüllt werden sollen. Also habe ich mir eine TSTringList gebastelt: MyList:=TStringList.Create; //globales Objekt, wird im Konstruktor erzeugt und im Destruktor zerstört //Die Combos werden in einer for-Schleife erzeugt: comboBox[iCnt]:= TComboBox.Create; comboBox[iCnt].Parent:=self; comboBox[iCnt].Items.Assign(MyList); Wie kann ich eine Referenz auf MyList übergeben, so, dass jede Änderung an MyList automatisch an ALLE Combos weitergereicht wird? Hintergrund: Wenn eine String in einer Combo ausgewählt wurde, darf dieser in keiner anderen Box mehr auftauchen (eine doppelte Auswahl muss unbedingt verhindert werden), weshalb ich am Liebsten den gewählten String aus MyList löschen würde... Blöderweise hat aber offensichtlich jede ComboBox ihre eigene Liste... Vielen Dank im Voraus für Eure Hilfe |
Re: Zuweisen einer TStringList zu mehreren TComboBoxen
Vielleicht hilft dir eine völlig andere Benutzeroberfläche.
Statt mehrere Comboboxen gibt es nur 2 Listboxen. In der linken Listbox ist der Vorrat aller möglichen Strings; in der rechten Listbox werden die gewählten Strings in ihrer Reihenfolge angezeigt. Wähl mal im Delphi Menu: Datei -> Neu -> Formulare -> "Dialog mit zwei Listenfeldern" und du bekommst ein Formular, das du abkupfern kannst. Durch diese Benutzeroberfläche wird schon von Grund auf verhindert, dass man zweimal das Gleiche auswählen kann. |
Re: Zuweisen einer TStringList zu mehreren TComboBoxen
Hallo Shmia
Vielen Dank für Deine Antwort. Leider sind zwei Listboxen keine Option. Ich Importiere eine CSV-Datei und lasse die Überschriften in einer Tabellenzeile anzeigen. In der Zweiten Zeile stehen die oben erwähnten Comboxen. Der Benutzer wählt nun in der zweiten Zeile per DropDown den Feldnamen, in den die CSV-Spalten übertragen werden sollen. Meine aktuelle Lösung sieht BTW so aus, dass bei Änderung des Strings dieser aus meiner globalen Liste gelöscht und anschliessend per for-Schleife jeder einzelnen Combo zugewiesen wird. Das funktioniert zwar, dauert aber jedesmal relativ lange (vom Speicherbedarf mal abgesehen). Deshalb würde ich gerne auf eine einzige Stringliste per Referenz zugreifen... |
Re: Zuweisen einer TStringList zu mehreren TComboBoxen
Dass das so lange dauern soll, kann ich mir irgendwie nicht vorstellen :gruebel:
Ich habe mal einen ReimGenerator geschrieben, der im Kern auch mit einer StringList arbeitet. Und ich habe ungefähr 200.000 Begriffe in der Stringlist und suche immer Begriffe raus und ordne sie einer ListBox zu... das dauert bei 100 Begriffen keine Sekunde... |
Re: Zuweisen einer TStringList zu mehreren TComboBoxen
Zitat:
Angenommen deine Zieltabelle hat 10 Felder: F01 bis F10 Deine CSV-Datei habe 8 Felder: CSV#1 bis CSV#8 Dann könnte eine Feldzuordnung so aussehen:
Code:
Felder, die oben nicht zugeordnet wurden, werden mit NULL befüllt.
F01 <- CSV#1
F02 <- CSV#2 F03 F04 F05 F06 F07 <- CSV#6 F08 <- NOW() F09 <- CSV#6 F10 Die Zuordnung bei NOW() bedeutet, dass die Information für "F08" nicht aus der CSV-Datei kommt, sondern einen internen Wert (aktuelles Datum+Uhrzeit) erhält. Wie man sieht sind die Felder der Zieltabelle fest vorgegeben, während die CSV-Felder durchaus mehrfach benützt werden dürfen. |
Re: Zuweisen einer TStringList zu mehreren TComboBoxen
Hallo,
was dauert denn lange, der globale Code oder das Eintragen in die ComboBoxen ? Beim 2.: Schon mit ComboBox.Items.BeginUpdate/EndUpdate probiert ? Heiko |
Re: Zuweisen einer TStringList zu mehreren TComboBoxen
Hei Hoika :-)
Das Eintragen in die ComboBoxen dauert relativ lange. Es sit so, dass man beim Zuklappen einer Combobox eine kurze(!) Verzögerung mitbekommt (das ist für mich "relativ lange"). Begin- und EndUpdate sind drin. Aber um mal konkret zu werden: Gibt es keine Möglichkeit, einen einzige StringListe für alle Combos zu verwenden? BTW: @Shmia:Die CSV-importierten Felder kommen zunächst zum DB-Server (PostgreSQL), und werden dann per plpgsql in ca. 20 Tabellen verteilt. Deshalb darf Jeder CSV-Wert nur einmal verwendet werden. |
Re: Zuweisen einer TStringList zu mehreren TComboBoxen
Zitat:
TComboBox kapselt nur das entsprechende Win32-Control und dies benötigt seine eigene Liste. Und an dieser Tatsache liegt auch die Verzögerung begründet. Du könntest aber mittels Ownerdraw+eigene Datenhaltung versuchen das gewünschte verhalten nachzubauen. |
Re: Zuweisen einer TStringList zu mehreren TComboBoxen
Hallo
vielen Dank für Eure Hilfe, mal sehen, wie ich da weiter vorgehe... |
Re: Zuweisen einer TStringList zu mehreren TComboBoxen
Herzlich willkommen in der Delphi-PRAXiS, Giftpilz.
Ich stelle mir eine Datenbanktabelle mit 200 Feldern vor. Nach deinem Ansatz stehen die alle nebeneinander in einem Grid, damit ich in einer darunter angezeigten ComboBox das Field-Mapping angeben kann? Aus naheliegenden Gründen ordnen andere Tools die Felder vertikal an - man sieht einfach mehr. Auch über deine Idee, die zugeordneten Felder aus der Vorratsliste zu entfernen, solltest du nochmal nachdenken: Du kannst die Zuordnung für ein Feld nach deinem Ansatz erst wieder ändern, wenn du die ComboBox lokalisiert hast, in der du dieses Feld falsch zugeordnet hast. Nicht sehr benutzerfreundlich. Ich würde den Vorrat unangetastet lassen und über eine Markierung nachdenken, welche dem Benutzer signalisiert, welche Felder bereits zugeordnet wurden und welche nicht. Freundliche Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz