![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировка в TListView [D7, WinXP]
golubec © (2006-09-11 20:19:00)Кто знает эфективный способ сортировки в TListView по SubItems и по Caption
MBo (2006-09-13 08:47:00) [1]Вообще-то с данным кодом сортировка 10000элементов выполняется за малые доли секунды ...
procedure TForm5.FormCreate(Sender: TObject);
var
i: Integer;
ListItem: TListItem;
begin
for i := 0 to 9999 do begin
ListItem := ListView1.Items.Add;
ListItem.Caption := IntToStr(i);
ListItem.SubItems.Add(IntToStr(Random(100)));
ListItem.SubItems.Add(IntToStr(Random(1000)));
end;
end;
function ByFourth(Item1, Item2: TListItem; Data: integer): integer; stdcall;
var
n1, n2: cardinal;
begin
n1 := StrToInt(Item1.SubItems[Data]);
n2 := StrToInt(Item2.SubItems[Data]);
if n1 > n2 then
Result := -1
else if n1 < n2 then
Result := 1
else
Result := 0;
end;
procedure TForm5.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
begin
if Column.Index > 0 then
ListView1.CustomSort(@ByFourth, Column.Index - 1);
end;
Сергей М. (2006-09-13 08:26:00) [2]
> golubec (12.09.06 19:44) [5]
>
> А что неверно, не понял
У тебя в ListView у какого-то item'а нет 2-го subitem'а , потому и исключение возникает.
> элементы обрабатываются очень долго
Еще бы не долго !)
При каждом вызове ByFourth() выполняется одна и та же "мартышкина операция" StrToInt()
golubec (2006-09-12 19:44:00) [3]А что неверно, не понял
han_malign (2006-09-12 18:26:00) [4]
> Вроде что-то из-за значения -1, не разберусь
- что-то из-за значения 2
StringList здесь присутствует только в SubItems[2]
golubec (2006-09-12 17:58:00) [5]При сортировке по колонкам OnCompare элементы обрабатываются очень долго (150 эл ~ 5 секунд). Искал что-нить про сортировку, нашел:
function ByFourth(Item1, Item2: TListItem; Data: integer):
integer; stdcall;
var
n1, n2: cardinal;
begin
n1 := StrToInt(Item1.SubItems[2]);
n2 := StrToInt(Item2.SubItems[2]);
if n1 > n2 then
Result := -1
else if n1 < n2 then
Result := 1
else
Result := 0;
end;
ListView1.CustomSort(@ByFourth, 1);
Однако при пробе вызвать функцию появляется сообщение EStringListError с комментарием "List index out of bounds". Вроде что-то из-за значения -1, не разберусь (
Сергей М. (2006-09-12 09:19:00) [6]
> golubec (11.09.06 20:19)
В ListView встроен алгоритм сортировки QuickSort - он считается достаточно эффективным на большинстве характерных списков.
Германн (2006-09-12 03:00:00) [7]
> golubec (11.09.06 20:19)
>
> Кто знает эфективный способ сортировки в TListView по SubItems
> и по Caption
Т.е. ты считаешь реализацию обработчика события OnCompare не достаточно эффективным решением? Приведи тогда аргументы!