С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/47: Рейтинг темы: голосов - 47, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 11.11.2010
Сообщений: 7

Изменение цвета и/или шрифта заданных узлов TreeView

16.07.2012, 13:26. Показов 9993. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Гуглил, но ничего путного для себя не нагуглил по указанному сабжу. Возможно ли это в принципе?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2012, 13:26
Ответы с готовыми решениями:

Изменение шрифта и\или цвета в StatusBar
Всем привет. :) Вот появился вопрос. Имеется компонент StatusBar в свойстве Panels значится 5 StatusPanel. Мне нужно именить цвет в 1-й и...

Изменение цвета фона, шрифта и типа шрифта по выбору пользователя
Необходимо, чтобы в программе, изменялся цвет фона, шрифта, и изменялся тип шрифта, по выбору пользователя. Для шрифта я использовал...

Задайте изменение цвета кнопок и цвета шрифта на кнопках формы в ходе выполнения программы
1. Задайте изменение цвета кнопок и цвета шрифта на кнопках формы в ходе выполнения программы. 2. Создайте кнопку «Перемещение формы» ...

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
16.07.2012, 15:23
В принципе - возможно, но надо будет перерисовывать вручную все дерево полностью, включая и все кнопочки Свернуть/Развернуть, и линии, их соединяющие, ибо в Лазарусе просто реализовать OnCustomDrawItem недостаточно. Вот такая вот история получается:
Изображения
 
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
16.07.2012, 16:26
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Хотя нет. Вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
procedure TForm1.TVAdvancedCustomDrawItem(Sender: TCustomTreeView;
   Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
   var PaintImages, DefaultDraw: Boolean);
var
   NodeRect : TRect;
begin
   NodeRect := Node.DisplayRect(True);
   with (Sender as TTreeView).Canvas do
   begin
      DefaultDraw := True;
 
      if cdsSelected in State then // Выбранный пользователем элемент?
      begin
         Brush.Color := clHighlight;
         FillRect(NodeRect);
         if Node.Level = 1 then // Отмечаем цветом элементы первого уровня
            Font.Color := clYellow
         else
            Font.Color := clWhite
      end
      else // Обычный, не выбранный
      begin
         if Node.Level = 1 then
            Font.Color := clRed
         else
            Font.Color := clBlack;
      end;
      TextOut(NodeRect.Left + 2, NodeRect.Top + 1, Node.Text);
   end;
end;
 
procedure TForm1.TVCustomDraw(Sender: TCustomTreeView;
   const ARect: TRect; var DefaultDraw: Boolean);
begin
   // Убираем артефакты с фона TreeView
   with (Sender as TTreeView).Canvas do
   begin
      Brush.Color:=clDefault;
      FillRect(ARect);
   end;
   DefaultDraw := True;
end;
очень даже нормально получается:
Миниатюры
Изменение цвета и/или шрифта заданных узлов TreeView  
4
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
05.09.2013, 12:12
cdsSelected
Что это?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
05.09.2013, 13:48
Параметр State имеет вот такой тип: TCustomDrawState, и если cdsSelected присутствует во множестве - значит, элемент выбран пользователем.

Значения элементов множества можно посмотреть здесь
1
105 / 104 / 29
Регистрация: 15.01.2011
Сообщений: 515
26.09.2015, 12:39
volvo, спасибо.
Обязательно ли писать
Delphi
1
with (Sender as TTreeView).Canvas do
Можно ли оставить
Delphi
1
with Sender.Canvas do
И второй вопрос. Как я понимаю, метод OnCustomDrawItem в Lazarus не работает так, как в Delphi? Это так и задумано, или просто недоработка разработчиков Lazarus?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
26.09.2015, 12:51
Цитата Сообщение от WoodHead Посмотреть сообщение
Можно ли оставить
Можешь оставить, я привык приводить типы.
Цитата Сообщение от WoodHead Посмотреть сообщение
Как я понимаю, метод OnCustomDrawItem в Lazarus не работает так, как в Delphi? Это так и задумано, или просто недоработка разработчиков Lazarus?
А кто тебе сказал, что это недоработка разработчиков Лазарус? Что, Дельфи - это истина в последней инстанции? Может, это недоработка разработчиков Дельфи? LCL мне кажется более продуманной, там можно делать вещи, в принципе невозможные в VCL.
1
105 / 104 / 29
Регистрация: 15.01.2011
Сообщений: 515
26.09.2015, 16:57
volvo, думаю, лучше сделать, как вы, т. е. привести типы. Чтобы не разбираться потом с микроскопом, в чём отличие TTreeView и TCustomTreeView.
По поводу LCL верю вам на слово. Просто в подобной теме по Delphi вы обошлись CustomDrawItem, и всё работало. А здесь пришлось прибегнуть к AdvancedCustomDrawItem.

Никак не пойму, когда вызывается AdvancedCustomDrawItem. Допустим, пишу такой код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TDataPointForm.ElementTreeViewAdvancedCustomDrawItem(
  Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState;
  Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
var
 NodeRect : TRect;
 MaxID: integer;
begin
  // определение максимального ID
  // вариант 1
  MaxID:=GetMaxID(TreeStringList).ID+1;
  // вариант 2
  // MaxID:=GetMaxID(TreeView1.Items.GetFirstNode)+1;
 
  NodeRect := Node.DisplayRect(True);
  with (Sender as TTreeView).Canvas do
    begin
      DefaultDraw := true;
      if Integer(Node.Data) = MaxID then
        Font.Color := clRed;
      TextOut(NodeRect.Left + 2, NodeRect.Top + 1, Node.Text);
    end;
end;
Функция GetMaxID в первом варианте работает со StringList (т. е. TreeView не дергает вообще), во втором варианте - идёт перебор по дереву.
В результате, после построения дерева в первом варианте текст узла остаётся чёрным (красным становится после повторного построения), во втором варианте - окрашивается после первого построения. Ума не приложу, в чём дело.

Добавлено через 11 минут
Прошу прощения, ввёл в заблуждение. Напутал с определением ID в коде, AdvancedCustomDrawItem вызывался в обоих случаях.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.09.2015, 16:57
Помогаю со студенческими работами здесь

Изменение видимости Panel при выборе узлов TreeView
Добрый день! Помогите, пожалуйста! Есть treeview1. В нем находится два главных узла. В каждом из них находится по три дочерних. И в...

Изменение цвета шрифта
В программе по событию меняю цвет шрифта CategoryPane, которая содержит в себе разные элементы, такие как Edit кнопки и прочее. При этом,...

Изменение цвета шрифта
Есть 5 слов, необходимо вывести их разными цветами. Пробовал system("color"); и с помощью Handle. Вообще не получилось, так как оно...

Изменение шрифта отдельных слов в TreeView
Добрый день! Изучением WPF занялся совсем недавно, поэтому возник вопрос. Необходимо, чтобы программа выделяла жирным шрифтом во всех...

Изменение цвета и шрифта в форме
вся форма состоит тока из label1-12 и собственно сама форма form2 в форме есть: form2.fontdialog1 для шрифта/размера ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru