Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

Сортировка в TListView   Найти похожие ветки 

 
golubec   (2006-09-11 20:19) [0]

Кто знает эфективный способ сортировки в TListView по SubItems и по Caption


 
Германн ©   (2006-09-12 03:00) [1]


> golubec   (11.09.06 20:19)
>
> Кто знает эфективный способ сортировки в TListView по SubItems
> и по Caption

Т.е. ты считаешь реализацию обработчика события OnCompare не достаточно эффективным решением? Приведи тогда аргументы!


 
Сергей М. ©   (2006-09-12 09:19) [2]


> golubec   (11.09.06 20:19)


В ListView встроен алгоритм сортировки QuickSort - он считается достаточно эффективным на большинстве характерных списков.


 
golubec   (2006-09-12 17:58) [3]

При сортировке по колонкам 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, не разберусь (


 
han_malign ©   (2006-09-12 18:26) [4]


> Вроде что-то из-за значения -1, не разберусь

- что-то из-за значения 2  
StringList здесь присутствует только в SubItems[2]


 
golubec   (2006-09-12 19:44) [5]

А что неверно, не понял


 
Сергей М. ©   (2006-09-13 08:26) [6]


> golubec   (12.09.06 19:44) [5]
>
> А что неверно, не понял


У тебя в ListView у какого-то item"а нет 2-го subitem"а , потому и исключение возникает.


> элементы обрабатываются очень долго


Еще бы не долго !)
При каждом вызове ByFourth() выполняется одна и та же "мартышкина операция" StrToInt()


 
MBo ©   (2006-09-13 08:47) [7]

Вообще-то с данным кодом сортировка 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;



Страницы: 1 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.048 c
15-1157125721
real
2006-09-01 19:48
2006.10.01
Генератор афоризмов - существует такое?


15-1157657860
Real
2006-09-07 23:37
2006.10.01
RSS - по программированию и не только


15-1157967758
Dbn
2006-09-11 13:42
2006.10.01
Интересные статьи про ноутбуки.


1-1155800887
dm37
2006-08-17 11:48
2006.10.01
легенда Chart


2-1157722946
Adios
2006-09-08 17:42
2006.10.01
Не работает функция