Перейти к содержанию
Fire Monkey от А до Я
  • 0

TTreeViewItem применение AlternatingRowBackground


Frol

Вопрос

Опубликовано (изменено)

Всем привет. Есть дерево у которого TreeView.AlternatingRowBackground:=true;

все отображается так, как надо

image.png.2cd000694a7b046b9b962d385e02dccd.png

Теперь у дерева надо скрыть какие-то узлы изменяя их видимость

for i:=0 to TreeView.Count-1 do TreeView.Items[i].Visible:= (i mod 5)<>0;

В данном случае скрывается каждый пятый узел.

И вот, что получается

image.png.e1b9cf7fab3945b23f6e29ebccd36269.png

Чередование нарушается.

Как можно вернуть правильное чередование?

 

В реальном проекте структура узлов более сложная, есть несколько различных правил по котором надо скрывать или показывать узлы.  Не хочется удалять узлы и перестраивать дерево заново каждый раз. Скрытие узлов через Visible:=false выглядит очень привлекательно. 

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

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

  • 0
Опубликовано (изменено)

Спасибо Dmitry_4501. Есть вариант решения. В стиле под TTreeViewItem подкладывается прямоугольник. и дальше организуется подобный цикл

Цитата

procedure TForm1.bnSetBackgroundsClick(Sender: TObject);
var
  i,C: Integer;
  Item: TTreeViewItem;
begin
  C:=-1; //номер строки
  for i := 0 to TreeView1.GlobalCount - 1 do
  begin
    Item := TreeView1.ItemByGlobalIndex(i);
    if not Item.Visible then Continue;
    Inc(C);
    case (C mod 2)+Item.IsSelected.ToInteger*2 of // (0 или 1)+(0 или 2)
      0:   Item.StylesData['background.fill.color'] := TAlphaColorRec.White;         //четная
      1:   Item.StylesData['background.fill.color'] := TAlphaColorRec.Whitesmoke;    //нечетная
      else Item.StylesData['background.fill.color'] := TAlphaColorRec.Paleturquoise; //Selected (2 или 3)
    end;
  end;
end;

Подобный подход достаточно гибкий. Можно раскрашивать не в два, а в три цвета, например. Но есть "всякие но и если".

  1. Если какой-то узел мы делаем невидимым Item.Visible:=false, то и все его дочерние узлы надо не забыть сделать невидимыми
  2. развертывание/свертывание узлов, добавление/удаление/перемещение, сокрытие (само собой) - надо не забыть и переопределить цвета бэккграунда
  3. Прямоугольник по своей ширине не совпадает с шириной дерева. 

image.png.e1e24380a0eafb555de99ec7446a514e.png

Вот тут видно - каждый следующий уровень вложения и прямоугольник все Уже и Уже. Если уровней 1-2, то не портит картинку, на мой взгляд, но если 3-4 или больше, то уже может резать глаз кому-то. Стандартное раскрашивание заполняется на всю ширину. И стандартное раскрашивает все само, что очень удобно ))), а так придется следить за деревом... Само не перерисуется (((

Если у кого появятся еще идеи - буду признателен... 

 

UPD

Margins.Left:=-1000 для прямоугольника бэкграунда решает проблему лесенки. Все получается во всю ширину и очень опрятно. 

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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

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

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

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

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

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

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

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