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
-
Mach's virtuell:
-
EOP schrieb:
Mach's virtuell:
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:
-
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 mitData = 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 ....