![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TTreeView.CustomSort [D7]
Виталий_д © (2008-09-03 22:43:00)Хочу в определенных узлах отсортировать всех детей этого узла. Сортиру по своему критерию на который указывает TTreeNode.Data.
Для одного из типов записей (тип записей я храню в структуре на которую указывает TTreeNode.Data) я хочу что бы во время сортировки он всегда оставался самым последним.
Делаю в нужном месте:
TTreeView.Selected.CustomSort(@CustonSortFnct, 0);
function CustonSortFnct(Node1, Node2: TTreeNode; Data: Integer): Integer; stdcall;
begin
if TTreeData(Node1.Data^).TreeIemType = 1 then
Result := -1
else
Result := AnsiStrIComp(....)
end;
Но получается странное поведение. При применении сортировки один раз - сортируется все как нужно, элемент оказывается в списке последним. А если применить сортировку снова, то логика работы изменяется и элемент уе не оказывается последним. Что я делаю не так?
Deltas (2008-09-04 05:05:00) [1]Извиняюсь, написал бред... в 4 утра такое бывает. Вот код:
function CustonSortFnct(Node1, Node2: TTreeNode; Data: Integer): Integer; stdcall;
begin
if TTreeData(Node1.Data^).TreeIemType = 1 then Result := +1
else
if TTreeData(Node2.Data^).TreeIemType = 1 then Result := -1
else Result := AnsiStrIComp(....);
end;
Deltas (2008-09-04 04:58:00) [2]
> if TTreeData(Node1.Data^).TreeIemType = 1 then
> Result := -1
Не понятно, почему Result := -1. В этом случае Node1 окажется меньше Node2, и Ваш "особенный" элемент "поползет" вверх в сортирующемся списке.
Учитывая, сказанное выше
> Servy © (04.09.08 02:23) [1]
, попробуйте переписать функцию сортировки следующим образом:
function CustonSortFnct(Node1, Node2: TTreeNode; Data: Integer): Integer; stdcall;
begin
if (TTreeData(Node1.Data^).TreeIemType = 1) or (TTreeData(Node2.Data^).TreeIemType = 1)then
Result := +1
else
Result := AnsiStrIComp(....)
end;
Servy (2008-09-04 02:23:00) [3]Проверок не проводил, так как поздновато, но есть предположение, что ваш "особенный" элемент может быть передан не только как Node1, но и как Node2. Пусть ваш особый элемент это X, при сравнении элементов (X, A) мы получим -1, а при сравнении (A, X) мы получим результат в зависимости от AnsiStrIComp. Потому и поведение меняется.
Попробуйте рассмотреть в функции сравнения вариант, что ваш "особый" элемент попал в Node2, а не Node1, я думаю тогда все заработает как вы ожидаете :).