Viele Einträge in ListBox



  • Ich stehe vor folgendem Problem: Ich schreibe eine Text file in eine ListBox. Die ListBox ist für meine Anwendung ideal, da ich den Text Zeilenweise markieren möchte und die Steuerung der ListBox und das verwalten des Inhaltes relativ einfach ist. Nun habe ich aber Texte die mehrere Tausend Zeilen beinhalten, einige sogar mehrere zehntausend. Das scheint die ListBox aber nicht zu mögen, denn die Zeit die es zum einfügen benötigt nimmt mit der Anzahl Zeilen logarithmisch zu. So braucht es für 10'000 Zeilen gut 2s und für 30'000 schon etwa 10 s. Nun frage ich mich ob ich fahrlässig die ListBox missbrauche, oder ich etwas nicht berücksichtige.

    Bisher beschreibe ich die Listbox etwa so:

    …  
    
       main->ListBox3->Clear();
    
       main->ListBox3->Items->Capacity= Inhalt.size();
    
       for(int x=0;x<= Inhalt.size();x++)
       {
          main->ListBox3->Items->Add(Inhalt.at(x).c_str());
       }
    
       …
    

    Wobei

    std::vector <std::string> Inhalt; //der Inhalt der Text File
    




  • EOP schrieb:

    Mach's virtuell:

    http://www.google.com/search?q=virtual+listbox

    Danke für die Antwort

    Klingt schon mal interessant. Aber nach einer halben Stunde die ich nun beim googeln verbracht habe, habe ich nichts Gescheites für C++ gefunden. Kann mir jemand einen spezifischeren Link, oder ein Beispiel geben?



  • Hier ein Beispiel für eine CListCtrl:

    http://www.codeproject.com/KB/list/virtuallist.aspx



  • Hallo

    Eventuell lohnt es sich ja auch, wenn du die einzelnen Einträge nicht per Items->Add einträgst, sondern erst im Hintergrund zu einem einzigem String zusammenbaust, getrennt durch Zeilenumbruch, und dann als ganzes an Items->Text übergibst.

    Desweiteren : Auch der TListView hat einen Virtual-Modus. Siehe Suchfunktion hier im Forum, die BCB-Hilfe sowie das spezielle Beispiel das beim Builder dabei ist.

    bis bald
    akari



  • Ich weiss nicht ob das was ist, aber bei der ListBox unter styles gibt es die Auswahl "lbVirtual". Die Beschreibung passt auf die beschriebene Funktion der Virtual ListBox. Nur muss dort das Event OnData definiert werden. Beim recherchieren habe ich nicht genau herausgefunden was nun dort eingegeben werden muss. Es klang vom Prinzip her ein wenig wie der OnDrawItem Event.

    Weiss jemand darüber bescheid?



  • Ok, hab’s hinbekommen, ist ja ziemlich einfach. Unter OnData einfach

    void __fastcall Tmain::ListBox1Data(TWinControl *Control, int Index,
          AnsiString &Data)
    {
            Data = Inhalt[Index].c_str();
    }
    

    einfügen und beim beschreiben der ListBox noch

    main->ListBox1->Count=Inhalt.size();
    

    definieren und schon geschehen.

    Aber danke für die Hilfe, währe sonst nicht mal in die nähe davon gekommen...



  • Eigentlich musst du nur in dem OnData Ereignis der ListBox (style=lbVirtual)
    die Daten übergeben mit

    Data = Inhalt.at(Index).c_str();
    

    und natürlich per

    ListBox1->Count = Inhalt.size();
    

    einmal die Anzahl der Zeilen der ListBox mitteilen.

    hm ok zu spät ....


Anmelden zum Antworten