Главная страница
    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.014 c
3-1153905488
MN
2006-07-26 13:18
2006.10.01
Как программно создать пользователя базы ACCESS?


15-1157982084
Rule
2006-09-11 17:41
2006.10.01
понедельничная задачка, для поступающих в первый класс


2-1158152685
K_Lock
2006-09-13 17:04
2006.10.01
Query_SQL &amp; RETURNING


3-1153815094
Sasha K
2006-07-25 12:11
2006.10.01
Как сжать базу FireBird(не бэкап)???


2-1158136961
Gem
2006-09-13 12:42
2006.10.01
Ошибка: Недопустимый флаг преобразования





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский