Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка в 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 не достаточно эффективным решением? Приведи тогда аргументы!


Наверх

Титульная страница Поиск, карта сайта Написать письмо