Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.12;
Скачать: 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 вся ветка

Текущий архив: 2008.10.12;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.017 c
6-1193993911
Artik
2007-11-02 11:58
2008.10.12
Запуск программ по сети.


2-1220279317
Terasbetoni
2008-09-01 18:28
2008.10.12
Подскажите, следует ли использовать структуру MDI


15-1219085284
programmer90
2008-08-18 22:48
2008.10.12
Нужен инсталлятор


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


3-1207766708
Delphi7
2008-04-09 22:45
2008.10.12
Access/ADO/Delphi7, Проблема с LookUp-полями