i.r.khayrullin Опубликовано 10 февраля, 2016 Поделиться Опубликовано 10 февраля, 2016 Добрый день! Пытаюсь отсортировать элементы дерева таким образом: procedure TForm1.SortTreeItemsClick(Sender: TObject); begin TreeView1.Sort(MySortTree); TreeView1.RealignContent; end; Элементы дерева приводятся на свое место, но их отображение прекращается. Некоторые элементы видны как фантомы, некоторые - пустые строки. Перепробовал всё, пытаясь обновить дерево, ничего не удалось. Демка во вложении, там есть работающий вариант с ListBox. TestingSort.zip Цитата Ссылка на комментарий
0 enatechno Опубликовано 11 февраля, 2016 Поделиться Опубликовано 11 февраля, 2016 (изменено) По приложенному примеру: в MySortTree нужно TTreeViewItem вместо TListBoxItem. при работе с TListBox и TTreeVew (заполнение и пр.) рекомендую использовать .BeginUpdate и .EndUpdate. По проблеме: Так вроде показывает без фантомов: procedure TForm1.SortTreeItemsClick(Sender: TObject); begin TreeView1.BeginUpdate; try TreeView1.Sort(MySortTree); TreeView1.ExpandAll; finally TreeView1.EndUpdate; end; end; P.S. А Вы используете какое-то особое правило сортировки? Если нет, рекомендую просто использовать TreeView1.Sorted := true для автоматической сортировки в алфавитном порядке по тексту в айтемах. Изменено 12 февраля, 2016 пользователем Brovin Yaroslav i.r.khayrullin и Kitty 2 Цитата Ссылка на комментарий
0 i.r.khayrullin Опубликовано 11 февраля, 2016 Автор Поделиться Опубликовано 11 февраля, 2016 Да, ошибка вышла, торопился написать пример. В рабочем проекте, конечно никаких ListBoxItem небыло. Спасибо, обычно использую. Просто старался минимизировать пример, что бы найти проблему методом "проб". Пробовал и том числе и BeginUpdate - не помогало. А вот про ExpandAll я бы не догадался. Почему так? Не понимаю. procedure TCustomTreeView.ExpandAll; var i: Integer; Item: TTreeViewItem; begin BeginUpdate; try for i := Count - 1 downto 0 do begin Item := Items[i]; if Item <> nil then Item.ExpandAll; end; finally EndUpdate; end; end; Не пойму, что в этом коде заставляет TreeView "обновиться"? Отдельно конструкция BegniUpdate > EndUpdate не работает. По поводу Sorted:= True, да, в моем проекте элементы будут сортироваться по определенным правилам. На верхнем уровне сортировки вообще не будет. Спасибо. Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 12 февраля, 2016 Администраторы Поделиться Опубликовано 12 февраля, 2016 Выравнивать итемы заставляет метод EndUpdate. Но только, если были внутри секции BeginUpdate/EndUpdate были изменения требующие выравнивания. Если хотите форсировать выравнивание, это можно сделать так: (TreeView1 as IAlignRoot).Realign; Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 12 февраля, 2016 Администраторы Поделиться Опубликовано 12 февраля, 2016 Чтобы отсортировать TTreeView нужно делать так: Устанавливаете свойство TTreeView.Sorted = True Задаем обработчик сравнения TTreeView.OnCompare. Kitty 1 Цитата Ссылка на комментарий
Вопрос
i.r.khayrullin
Добрый день!
Пытаюсь отсортировать элементы дерева таким образом:
Элементы дерева приводятся на свое место, но их отображение прекращается. Некоторые элементы видны как фантомы, некоторые - пустые строки.
Перепробовал всё, пытаясь обновить дерево, ничего не удалось. Демка во вложении, там есть работающий вариант с ListBox.
TestingSort.zip
Ссылка на комментарий
4 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.