Главная страница
    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.46 MB
Время: 0.011 c
1-1156015944
mahab
2006-08-19 23:32
2006.10.01
TshelllistView


15-1157977985
Tab
2006-09-11 16:33
2006.10.01
Кто как делает Разграничение доступа в программе?


15-1158048675
ПЛОВ
2006-09-12 12:11
2006.10.01
Вот тут возник такой вопрос


15-1158046892
wwwrr
2006-09-12 11:41
2006.10.01
Как в поле записать NULL значение...


15-1157617986
Kerk
2006-09-07 12:33
2006.10.01
VolgaMastakParty





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