Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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, я думаю тогда все заработает как вы ожидаете :).


Наверх

Титульная страница Поиск, карта сайта Написать письмо