Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

Сортировка в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.013 c
2-1157968494
Chuk &amp; Gek
2006-09-11 13:54
2006.10.01
Защита


1-1155738480
vase21
2006-08-16 18:28
2006.10.01
Фотография выделенной части формы


15-1157719853
oldman
2006-09-08 16:50
2006.10.01
Типа тест...


10-1123870709
mufan
2005-08-12 22:18
2006.10.01
Отчет в Word


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский