Форум: "Начинающим";
Текущий архив: 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