Вниз
Скачать: CL | DM;

TTreeView.CustomSort   Найти похожие ветки 

 
Виталий_д   (2008-09-03 22:43) [0]

Хочу в определенных узлах отсортировать всех детей этого узла. Сортиру по своему критерию на который указывает 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;


Но получается странное поведение. При применении сортировки один раз - сортируется все как нужно, элемент оказывается в списке последним. А если применить сортировку снова, то логика работы изменяется и элемент уе не оказывается последним. Что я делаю не так?


 
Servy ©   (2008-09-04 02:23) [1]

Проверок не проводил, так как поздновато, но есть предположение, что ваш "особенный" элемент может быть передан не только как Node1, но и как Node2. Пусть ваш особый элемент это X, при сравнении элементов (X, A) мы получим -1, а при сравнении (A, X) мы получим результат в зависимости от AnsiStrIComp. Потому и поведение меняется.

Попробуйте рассмотреть в функции сравнения вариант, что ваш "особый" элемент попал в Node2, а не Node1, я думаю тогда все заработает как вы ожидаете :).


 
Deltas ©   (2008-09-04 04:58) [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;


 
Deltas ©   (2008-09-04 05:05) [3]

Извиняюсь, написал бред... в 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;



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.011 c
2-1220425933
Сергей
2008-09-03 11:12
2008.10.12
Как отключить выбор пункта по первым буквам в ComboBox?


15-1219490687
POP
2008-08-23 15:24
2008.10.12
Список установленных COM портов в системе.


15-1219391037
brother
2008-08-22 11:43
2008.10.12
ручное обновление AviraAntivir


15-1219248023
sqler
2008-08-20 20:00
2008.10.12
простой SQL запрос


1-1199816989
Wolf
2008-01-08 21:29
2008.10.12
Как установить лимит по времени на некую процедуру ?




   Наверх