[ListView] 2 Items tauschen
-
Hallo,
ich versuche innerhalb einer TListView im Report Style 2 ListItems zu tauschen. Dazu habe ich einen Dreieckstausch versucht, der aber leider scheitert. Fällt jemanden von euch auf was ich falsch mache?Der Hintergrund des ganzen ist, dass ich eine Sortierfunktion schreiben möchte um in 2 Stufen später erst nach Caption zu sortieren, danach anhand Subitems->Strings[2] innerhalb der identischen Itemcaption den 2. Sortierdurchlauf.
if(ListView1->Items->Count > 0) { for(int i = 0; i < ListView1->Items->Count; i++) { if( i + 1 < ListView1->Items->Count) { if(ListView1->Items->Item[i]->Caption.ToInt() > ListView1->Items->Item[i + 1]->Caption.ToInt()) { TListItem *tempitem; tempitem = ListView1->Items->Item[i + 1]; ListView1->Items->Item[i + 1] = ListView1->Items->Item[i] ; ListView1->Items->Item[i] = tempitem; i = 0; } } } }
-
Argh....tempitem ist ja nur ein Pointer auf das bereits
bestehende Listitem. Das kann ja so nicht funktionieren.Allerdings scheitert dies ebenfalls:
TListItem *tempitem = new TListItem(ListView1->Items);
Was mache ich falsch?
-
Hallo
Wenn du den Kopierkonstruktor benutzen willst, dann must du schon als Wert übergeben und nichts als Zeiger
// Vor dem Konstruktor den zeiger aus Items dereferenzieren TListItem *tempitem = new TListItem(*(ListView1->Items->Item[i + 1])); ListView1->Items->Item[i + 1] = ListView1->Items->Item[i] ; ListView1->Items->Item[i] = tempitem;
bis bald
akari
-
Ähm, das funktioniert so und erzeugt kein Speicherleck?
Geht denn Folgendes:#include <algroithm> void Form1::OnSomething() { std::swap( *ListView->Items->Item[i], *ListView->Items->Item[i +1] ); }
-
Hallo
Ich habe jetzt nicht auf Speicherlecks geachtet, sondern nur auf die Anwendung im Kopierkonstruktor. Wie sich die OwnerShip der Objekte in Items (das ja immerhin über die VCL-Property Items angesprochen wird) verhält hab ich jetzt nicht im Kopf.
std::swap sollte anwendbar sein, wenn man von TListItem auch Instanzen auf dem Stack anlegen kann. Was ja wei VCL-Klasen nicht üblich ist.bis bald
Stefan
-
Danke Jungs!
werds testen wenn ich Daheim bin
-
Beide Varianten funktionieren nicht mit den Begründungen die ihr bereits genannt habt. Wenn alle Stricke reissen gehe ich den Lösungsweg über die Itemstrings und tausche die aus
-
Es gibt ja noch die Methode Assign mit der du ein TListItem kopieren kannst. Damit sollte eine Art swap doch machbar sein.
-
Tauschen von zwei Items machen ich so:
TListItem* tmp = ListView->Items->Add(); tmp->Assign(ListView->Items->Item[index1]); ListView->Items->Item[index1]->Assign(ListView->Items->Item[index2]); ListView->Items->Item[index2]->Assign(tmp); tmp->Delete();
Es funktioniert und ist recht simpel. Ein Speicherleck sollte nicht auftreten.
mfg
xXx
-
Ich danke euch sehr für die tollen Erklärungen