Перейти к содержанию
  • Регистрация
  • 0
i.r.khayrullin

Сортировка с использованием функции TTreeView.Sort

Вопрос

Добрый день!

 

Пытаюсь отсортировать элементы дерева таким образом:

procedure TForm1.SortTreeItemsClick(Sender: TObject);
begin
  TreeView1.Sort(MySortTree);
  TreeView1.RealignContent;
end;

Элементы дерева приводятся на свое место, но их отображение прекращается. Некоторые элементы видны как фантомы, некоторые - пустые строки. 

 

Перепробовал всё, пытаясь обновить дерево, ничего не удалось. Демка во вложении, там есть работающий вариант с ListBox.

TestingSort.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

По приложенному примеру:

  1. в MySortTree нужно TTreeViewItem вместо TListBoxItem.
  2. при работе с 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 для автоматической сортировки в алфавитном порядке по тексту в айтемах.

Изменено пользователем Brovin Yaroslav

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

  1. Да, ошибка вышла, торопился написать пример. В рабочем проекте, конечно никаких ListBoxItem небыло.
  2. Спасибо, обычно использую. Просто старался минимизировать пример, что бы найти проблему методом "проб". Пробовал и том числе и 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

Выравнивать итемы заставляет метод EndUpdate. Но только, если были внутри секции BeginUpdate/EndUpdate были изменения требующие выравнивания.

 

Если хотите форсировать выравнивание, это можно сделать так:

(TreeView1 as IAlignRoot).Realign;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Чтобы отсортировать TTreeView нужно делать так:

  1. Устанавливаете свойство TTreeView.Sorted = True
  2. Задаем обработчик сравнения TTreeView.OnCompare.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...