Сотрировка в ListView
Земляне, помогите написать сортировку по столбцам в ListView CustomSort-ом плиз, заранее спасобо.
Итак, насколько я понял, ты хочешь СОБСТВЕННУЮ сортировку по колонкам втюхать,
делается это так (всё что ниже - копия из Борландовского хелпа):
This example shows how to use the OnColumnClick and OnCompare events of a list
view to let users sort the columns in a report-style list view by clicking on the
column headers. This requires a global variable to keep track of the column that was clicked:
int ColumnToSort = 0;
The OnColumnClick event handler sets the global variable to indicate the column to sort and calls AlphaSort:
// Это хендл для Event ColumnClick
void __fastcall TForm1::ListView1ColumnClick(TObject *Sender, TListColumn *Column)
{
ColumnToSort = Column->Index; // Это на какой колонке кликнули
((TCustomListView *)Sender)->AlphaSort(); // В это месте можно просто: ListView1->AlphaSort();
}
The OnCompare event handler causes the list view to sort on the selected column:
void __fastcall TForm1.ListView1Compare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare)
{
if (ColumnToSort == 0)
Compare = CompareText(Item1->Caption,Item2->Caption); // Здесь будет твоя функция сравнения элементов
else
{
int ix = ColumnToSort – 1;
Compare =
CompareText(Item1->SubItems->Strings[ix], Item2->SubItems->Strings[ix]); // Здесь тоже
}
}
Note: This OnCompare event handler uses the global CompareText function. An application
may want to use AnsiCompareText, CompareStr, or AnsiCompareStr instead, depending on whether
the comparison should be case-sensitive and whether the locale should be considered.
А вообщем-то вся эта хрень работает крайне медленно (если элементов более 3-5 тысяч), поэтому для
разрешения всего этого можно: либо писать в MS Visual C++ (для не сильно замороченных приложений)
либо впендюрить в Борландовский элемент TListView собственную реализацию вывода и хранения элементов
либо создать просто API элемент в форме. Кстати виндовый ListView попроще будет в управлении и
побыстрей, т.к. ты не будешь создавать (как Борланд) чудовищные списки хранимых строк, на
заполнение которых уходит львиная доля времени (при 100000 х 3 элементов загрузка TListView
длится на машине с 2200 ГГц и 512 Мб примерно 10 минут !!!!!!, в протововес, родной виндовый
ListView через Callback - не более 1 минуты).