ListView Colums ASC/DESC über Klick auf den Header des LV sortieren

  • ViewStyle = vsReport sein // im OI einstellen
  • ColumnClick = true // im OI einstellen
  • SortType = stData // im OI einstellen
  • *.h
private:

int ColumnToSort;
bool bSortASC;
  • *.cpp
// im Konstruktor der Form Variablen initialisieren
void __fastcall TfrmMain::TfrmMain()
{
    ColumnToSort = 1; // 1. zu sortierende Spalte, z.B. Name
    bSortASC = true;  // ASC sortieren
}

// OnColumnCompare Methode des LV, wird nur ausgeführt, wenn SortType == stData
void __fastcall TfrmMain::lvWindowsCompare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare)
{
    switch (ColumnToSort)
    {
          // Spalte 1 beinhaltet beispielsweise Strings
          case 0 : { Compare = bSortASC ? AnsiCompareStr(Item1->Caption, Item2->Caption) : -AnsiCompareStr(Item1->Caption, Item2->Caption);
                     break; }
          // Spalte 2 ist beispielsweise mit Zahlen gefüllt und würde mit AnsiCompareStr() falsch sortiert, daher Hilfsfunktion IntCompare (s.u.)
          case 1 : { Compare = bSortASC ? IntCompare(Item1->SubItems->Strings[ColumnToSort - 1].ToInt(), Item2->SubItems->Strings[ColumnToSort - 1].ToInt()) : -IntCompare(Item1->SubItems->Strings[ColumnToSort - 1].ToInt(), Item2->SubItems->Strings[ColumnToSort - 1].ToInt());
                     break; }
          // restl. Spalten (-> 2) mit Subitems sind wieder mit Strings gefüllt
          default : { Compare = bSortASC ? AnsiCompareStr(Item1->SubItems->Strings[ColumnToSort - 1], Item2->SubItems->Strings[ColumnToSort - 1]) : -AnsiCompareStr(Item1->SubItems->Strings[ColumnToSort - 1], Item2->SubItems->Strings[ColumnToSort - 1]); }
    }
}

// OnColumnClick Methode des LV
void __fastcall TfrmMain::lvWindowsColumnClick(TObject *Sender, TListColumn *Column)
{
    if (ColumnToSort == Column->Index)
    {
       bSortASC = !bSortASC;   // Sortorder ASC/DESC durch Klicken auf den Header umschalten
    }
    else
    {
        bSortASC = true; // am Anfang oder bei Klicken auf eine andere Spalte immer true setzen
    }

    ColumnToSort = Column->Index; // geklickte Spalte merken

    lvWindows->AlphaSort();       // LV sortieren
}

// Hilfsfunktion zum Vergleich zweier int-Werte
int __fastcall TfrmMain::IntCompare(int i1, int i2)
{
    return i1 == i2 ? 0 : i1 < i2 ? -1 : 1;
}