[FAQ Vorschlag] ListView Items innerhalb von Groups anhand Integer sortieren
-
Da ich bei dem Custom Sort Beispiel von Embarcadero an gewisse Grenzen gestoßen bin wenn es um Integer ging, habe ich mir die Rückgabewerte von CompareText angeschaut und die Funktion entsprechend für Integer umgeschrieben. Das Beispiel zeigt eine absteigende Sortierung. Möchte man aufsteigend sortieren die entsprechenden Rückgabewerte von < und > vertauschen. Zusätzlich wird in diesem Beispiel auch nur innerhalb von ListGroups sortiert. Da ich mir dachte das es bestimmt einige Interessieren dürfte, gebe ich hier mein Beispiel zum besten.
Wichtig: Die Customsort Funktion darf kein Mitglied der Hauptklasse, wie z.B TForm1 sein.
Deklaration:
int __stdcall SortListView(long,long,long);
Funktion:
int __stdcall SortListView(long Item1, long Item2, long Parameter) { TListItem *item1 = reinterpret_cast<TListItem *>(Item1); TListItem *item2 = reinterpret_cast<TListItem *>(Item2); if(item1->SubItems->Count > 4 && item2->SubItems->Count > 4) { int var1 = item1->SubItems->Strings[4].ToInt(); int var2 = item2->SubItems->Strings[4].ToInt(); if(item1->GroupID == item2->GroupID) { if(var1 == var2) return 0; if(var1 > var2) return -1; return 1; } else return 0; } return 0; }
Aufruf:
ListView1->CustomSort(SortListView,0); ListView2->CustomSort(SortListView,0);
-
Hallo,
Nur ein paar Verbesserungsvorschläge.
Du brauchst die casts nur einmal. Schreibe sowas:
TListItem * litem1 = reinterpret_cast<TListItem *>(Item1);
und verwende dann immer dieses litem1 bzw. 2.
Du kannst die ganzen else und das letzte if weglassen. siehe:
if(var1 == var2) return 0; if(var1 > var2) return -1; return 1;
-
Stimmt, so ist es um einiges sauberer und schneller in der Ausführung wenn man nicht immer explizit castet. Danke Braunstein