TComboBox Problem(sortieren von Einträgen)
-
...->Duplicates="einer_der_Werte"
"einer_der_Werte" ist einer der 3 Werte
sollte eigentlich gehen
mfg
Tom
-
bei mir sagt er aber Duplicates wäre kein Wert von Empfaenger(so der Name meiner ComboBox) äußerst misteriös.
Ich habe nochmal in die Hilfe geschaut und gesehen das Duplicates eine Eigenschaft von TCustomComboBox ist aber ich verwende doch eine TComboBox, könnte es daran liegen.
Achja und im Objektinspektor wird bei meiner TComboBox Duplicates auch nicht angezeigt.
-
und wenn du mal
Empfaenger->[STRG]+[LEERTASTE] für die Programmierhilfe drückst, kommt dann Duplicates zum vorschein oder auch nicht???
-
Nein kommt es nicht das ist komisch aber ich habe oben editiert kurz bevor du deinen Beitrag geschrieben hattest lies dort Mal bitte vielleicht hilft das ja.
-
Hallo,
Die Eigenschaft Dublicates gibt es nur bei der CLX-Version von TComboBox aber nicht bei der VCL-Version. Wenn du die VCL nutzt mußt du das schon von Hand erledigen (z.Bsp. wärend des Einfügens). Hilfreich dafür ist unter anderen die Methode TComboBox::Items::IndexOf().
Ciao
-
Ok das habe ich geschnallt doch wie setze ich CLX ein genauso wie VCL oder wie weil ich finde nirgends etwas damit ich CLX nutzen kann weil die Elemente oben in der Leiste sind doch alle VCL Elemente oder?
Was ist eigentlich der Unterschied von VCL und CLX und wo liegen die Vor und Nachteile von beiden???
@Braunstein könntest du mir ein Code Beispiel geben wie ich es mit deiner Methode über Items::IndexOf()
-
Bezüglich CLX:
Wenn du eine neue Anwendung erstellst (Datei/neu) hast du ja die Auswahl zwischen Anwendung (VCL) und CLX Anwendung. Die CLX ist eine anderer Bibliothek von Borland die prinzipiell ähnlich funktioniert wie die VCL, allerdings sowohl unter Linux (Kylix) als auch unter Windows eingestzt werden kann. Auf Grund dieser Kompatibilität gibt es doch einige Unterschiede zur VCL. Ich hab aber die CLX noch nie eingesetzt.
Bezüglich Einfügen:
Nehmen wir an du hast deine gewünschten Einträge in einer TStringList mit dem Namen list und deine ComboBox heißt box.box->Clear(); for( int i=0; i<list->Count; ++i) { if( box->Items->IndexOf(list->Strings[i]) == -1) box->Items->Add(list->Strings[i]); }So werden nur Strings eingefügt, die noch nicht drin sind.
-
einer TStringList mit dem Namen list
TStringList kennt Duplicates
-
Hast recht.
Wobei Items von TComboBox vom Typ TStrings ist und Dublicates somit nicht kennt. Bei meinem Beispiel hätte man natürlich das vorher in der StringList schon erledigen können. Er könnte seine Strings aber auch anders gespeichert haben.
-
also könnt ich das eigentlich auch nur mit einer TStringList machen indem ich alle Items der ComboBox da rein lade und wenn dann Duplicates auf ignorieren steht würde er die doppelten weglassen???
-
und willst dann alles wieder zur ComboBox zurückgeben?
Das erscheint mir etwas umständlich. Wie bringst du denn deine Einträge in die ComboBox?
-
Also ich bringe die Einträge über einen Button und den befehl:
Empfaenger->Items->Add(Empfaenger->Text);und jetzt wollte ich das sozusagen durch eine TStringList laufen lassen und dann wieder zurück wandeln.
Aber ich habe es ausprobert bei der Eingabe
AussortierteEmpfaenger=Empfaenger->Items; /*Meine TStringList Meine TComboBox*/sagt er mir.
E2034 Konvertierung von 'TStrings * const' nach 'TStringList *' nicht möglichAber ich dachte das wären beides TStringList da sie beide ähnliche Methoden und Funktionen haben.
-
Das geht auch so nicht. Du kannst Pointer nicht einfach zuweisen. Hier wäre die Memberfunktion Assign() angebracht. Du kannst aber auch wie in meinem Bespiel vor dem Add einfach mit IndexOf testen ob der Eintrag existiert.
Also soif(Empfaenger->Items->IndexOf(Empfaenger->Text) == -1) Empfaenger->Items->Add(Empfaenger->Text);Ist Empfaenger bei dir die ComboBox? Wieso fügst dann den gesamten Text der ComboBox da wieder ein? Oder ist das nur ein Schreibfehler?
-
Hallo
AussortierteEmpfaenger->Text=Empfaenger->Items->Text;ist das schnellste Verfahren.
bis bald
akari
-
ich werde deine Methode verwenden.
Wie meinst du das mit dem Pointer zuweisen also die TStringList ist ein Pointer den ich mit new Speicher zugewiesen habe, aber sonst gab es doch auch keine Probleme wenn ich nun zum Beispiel einer ersten TStringList eine Zweite zugewiesen hatte.
-
Wenn du das hier machst
AussortierteEmpfaenger=Empfaenger->Itemsund du hast vorher beiden Pointern mit new Speicherplatz zugewiesen überschreibst du ja den ersten Pointer und kannst ihn somit nicht mehr vernünftig freigeben.
@akari
Ist mir auch grade wieder eingefallen (hab mich an den entsprechenden Thread erinnert). Das Assign hatte sich nur so eingeprägt, dass es doch ab und zu noch mit rausrutscht.
-
Ach wenn man mit new Speicher zuweist ist dieser nicht dynamisch??? Aber wieso kann man nachdem man mit Add neue Elemente hinzugefügt hat trotzdem noch vernünftig freigeben?? Ist das dann ein geregeltes Wachstum???
Aber wieso kann man dann eine TStringList mit einer anderen überschreiben obwohl beides Pointer sind und somit Speicherplatz zugewiesen bekommen haben, eigentlich sind die ja verschieden groß oder?
Ich bin gerade etwas verwirrt daher bitte ich wiedermal um ein(ausführliche) Erklärung des Probs.@akari dachte mir schon das es so irgendwie auch gehen musste.
Achja und ihr sagt immer etwas von in der Hilfe durchklicken, aber ich komme damit gar nicht klar. Ich gehe also mit F1 auf Hilfe und dann auf TComboBox alles klar danach auf Eigenschaften und dann auf Items auch alles klar aber nun komm ich nicht weiter weil oben nicht sowas wie Methoden Eigenschaften o.ä. steht, aber ich wollte zum Beispiel etwas zu IndexOf() lesen kann das aber irgendwie nicht.
@edit Problem hat sich geklärt ich dussel muss einfach nur schauen vovon ITems ein Objekt ist also von TStrings und dort habsch doch alles.
-
Hallo
Aber wieso kann man dann eine TStringList mit einer anderen überschreiben obwohl beides Pointer sind und somit Speicherplatz zugewiesen bekommen haben, eigentlich sind die ja verschieden groß oder?
Ich bin gerade etwas verwirrt daher bitte ich wiedermal um ein(ausführliche) Erklärung des Probs.Dazu kann ich dir nur mal ein gutes Tutorial zum Thema "Grundlagen in C++" empfehlen, siehe das Menü oben rechts auf dieser Seite. Dort erfährst du den Unterschied zwischen Pointern und Instanzen.
bis bald
akari
-
akari schrieb:
AussortierteEmpfaenger->Text=Empfaenger->Items->Text;ist das schnellste Verfahren.
...es sei denn, man hat auch Objekte in die Liste per AddObject() eingefügt.
Dann ist Assign() womöglich schneller.Gruß,
Alexander
-
denn Unterschied kenne ich doch schon lange.
Zeiger verweisen nur auf etwas
Instanzen hingegen sind genaue Kopien sozusagendas Problem hat sich aber auch erledigt.