Форум: "Начинающим";
Текущий архив: 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