СортировкаTListView - ViewStyle = vsReportЕсли вы сталкивались с задачей сортировки в таблице ListView, то наверняка обратили внимание на ошибку сортировки чисел и вообще кривость этого действа, в этом посте я предоставлю код качественной сортировки колонок в TListView
Для начало нам надо подключить к проекту математику:
- Код: Выделить всё
#include <Math.hpp>
И объявить булеву переменную, которая нам понадобится для определения направления сортировки, а так же техническую переменную типа int - номер столбца:
- Код: Выделить всё
bool rev=true;
int ColumnToSort;
Обрабатываем события клика по столбцу:
- Код: Выделить всё
void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,
TListColumn *Column)
{
if ((rev==true)||(ColumnToSort != Column->Index)){rev=false;}
else if((rev==false)||(ColumnToSort != Column->Index)){rev=true;}
ColumnToSort = Column->Index;
((TCustomListView *)Sender)->AlphaSort(); //функция сортировки "стандартная"
}
Далее обрабатываем событие ListView OnCompare:
- Код: Выделить всё
void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1,
TListItem *Item2, int Data, int &Compare)
{
if (rev==false)
{
if ((ColumnToSort == 0)||(ColumnToSort == 1)||(ColumnToSort == 2))
{Compare = CompareText(Item1->Caption,Item2->Caption);}
else if ((ColumnToSort == 3)||(ColumnToSort == 4)||(ColumnToSort == 5)||(ColumnToSort == 6)||(ColumnToSort == 7)||(ColumnToSort == 8)||(ColumnToSort == 9))
{Compare = CompareValue(StrToFloat(Item1->SubItems->Strings[ColumnToSort-1]),StrToFloat(Item2->SubItems->Strings[ColumnToSort-1]));}
else
{Compare = CompareText(Item1->SubItems->Strings[ColumnToSort-1], Item2->SubItems->Strings[ColumnToSort-1]);}
}
else
{
if ((ColumnToSort == 0)||(ColumnToSort == 1)||(ColumnToSort == 2))
{Compare = CompareText(Item2->Caption,Item1->Caption);}
else if ((ColumnToSort == 3)||(ColumnToSort == 4)||(ColumnToSort == 5)||(ColumnToSort == 6)||(ColumnToSort == 7)||(ColumnToSort == 8)||(ColumnToSort == 9))
{Compare = CompareValue(StrToFloat(Item2->SubItems->Strings[ColumnToSort-1]),StrToFloat(Item1->SubItems->Strings[ColumnToSort-1]));}
else
{Compare = CompareText(Item2->SubItems->Strings[ColumnToSort-1],Item1->SubItems->Strings[ColumnToSort-1]);}
}
}
В этом примере таблица ListView насчитывает 10 столбцов. Столбцы 0, 1, 2 сортируются как текст, а столбцы 3, 4, 5, 6, 7, 8, 9 - как числа, причем если переменная rev имеет значение false, то идет сортировка по возрастанию, если значение переменной равно true, то сортировка идет в обратном порядке, по убыванию.