duplikate in stringlisten ausschließen - _property "Duplicates" nicht erkannt



  • hallo allesamt,

    habe den wunsch, die strings einer ListBox duplikatfrei zu halten. beim suchen bin ich (natürlich) auf die Eigenschaft "Duplicates" gestoßen, die in der BCB-Hilfe wunderbar nach der Lösung meines Problems aussieht. Leider existiert sie anscheinend jedoch nicht für alle StringLists...

    Ich habe hier im Forum dann noch folgendes entdeckt:

    const TStringList *temp  = new TStringList;
    temp->Duplicates = dupIgnore;
    

    was so allein auch funktioniert. Leider kann ich jedoch wie gesagt nicht folgendes machen:

    ListBox->Items->Duplicates = dupIgnore;
    

    denn da wirft der Compiler mal eben

    E2316 'Duplicates' ist kein Element von 'TStrings'
    

    Dann kam mir der Gedanke, ich könnte ja einfach eine

    const TStringList* m_SL;
    

    als Variable meiner Form deklarieren, dieser dann Duplicates = dupIgnore zuweisen und dann einfach

    ListBox->Items = m_SL;
    

    machen, aber nein! Hier gibts gleich zwei Fehler:

    [C++ Fehler] TOptions.cpp(58): E2024 const-Objekt kann nicht modifiziert werden
    [C++ Fehler] TOptions.cpp(59): E2034 Konvertierung von 'const TStringList *' nach 'TStrings *' nicht möglich
    

    Was kann ich tun?

    Freue mich über jeden Hinweis 🙂

    der oli



  • Wirfst Du da TStringList und TStrings ein bißchen durcheinander? TStrings ist keine TStringList, sondern TStringList enthält TStrings. Diese kannst Du anderen Komponenten zuweisen.

    Des Rätsels Lösung:

    ListBox->Items = m_SL->Strings;
    


  • Joe_M. schrieb:

    TStrings ist keine TStringList, sondern TStringList enthält TStrings.

    Das ist so nicht richtig. TStringList erbt von TStrings, man könnte also sagen: TStringList ist ein TStrings (klingt ein bisschen blöd).

    Zum eigentlichen Problem:
    Wie wäre es, wenn Du ein TStringList-Objekt erstellst, dort die Duplicates-Eigenschaft nach Belieben setzt und anschließend den Inhalt
    der ListBox zuweist:

    TStringList* tempList = new TStringList();
    tempList->Sorted = true;
    tempList->Duplicates = dupIgnore;
    tempList->Add("1234");
    // usw.
    ListBox->Items->Assign(tempList);
    

    Allerdings musst Du dann natürlich parallel die String-Liste mitführen.

    Gruß,

    Alexander



  • Hallo,

    Korrekterweise muss man sagen, dass TStringList von TStrings abgeleitet ist und nicht das sie sie enthält.
    @Joe_M
    Produzierst du hier nicht ein Speicherleck, wenn du den Orginalpointer Items von TListBox einfach überschreibst?
    Wie wäre es mit

    ListBox->Items->Assign(m_SL);
    

    [Edit]Zu spät 😉 [\Edit]



  • äh ja, das gibt ein Speicherleck... 😮

    Ich meinte das hier:

    ListBox1->Items->AddStrings(slTemp->Strings);
    

    Sorry...


Anmelden zum Antworten