Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.044 c
1-1200065812
Maloj2007
2008-01-11 18:36
2008.10.12
Фокус мыши над Items в TListBox


15-1219215654
Nucer
2008-08-20 11:00
2008.10.12
Помогите организовать структуру


1-1198513913
Blind Guardian
2007-12-24 19:31
2008.10.12
Алгоритм проверки на похожесть графиков двух функций


15-1219404029
cyborg
2008-08-22 15:20
2008.10.12
TDataGrid


15-1217308956
Наиль
2008-07-29 09:22
2008.10.12
За программы с открытым исходным кодом дают не плохие деньги





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский