Отключить и изменить цвет узла в Treeview

Я ищу способ отключить правильные узлы.

Допустим, я создал простую структуру treeview, как показано ниже:

  • Родительский элемент 1 (отключить)
  • Parent 2
    • Child 1
    • Ребенок 2 (отключить)

До сих пор я нашел обходной путь, как это сделать, но он все еще не работает. Я использую обработчик событий OnChanging:

procedure TForm1.TreeViewChanging(Sender: TObject; Node: TTreeNode;
  var AllowChange: Boolean); 
begin
   if (Node.Text = 'Parent 1') or (Node.Text = 'Child 1') then
      AllowChange := False;
end;

Это работает, потому что я не могу щелкнуть этот узел, но проблема в том, что после «отключения» узла таким образом цвет узлов Parent 1 и Child 1 такой же, как и у других. Можно ли изменить цвет этих узлов (серый)? Или, может быть, вы знаете другой способ отключения узлов в компоненте TTreeView?


person astack    schedule 22.09.2016    source источник
comment
Установите для свойства Enabled узла значение False.   -  person David Heffernan    schedule 22.09.2016
comment
@DavidHeffernan Я пробовал это, но, к сожалению, в моем случае это не работает. Ничего не делает...   -  person astack    schedule 22.09.2016
comment
может ХР? TVIS_EX_DISABLED — это Vista и более поздние версии. Или, возможно, нет темы выполнения ..   -  person Sertac Akyuz    schedule 22.09.2016
comment
Я использую WIN 8, и я не знаю, почему она не работает должным образом.   -  person astack    schedule 22.09.2016
comment
В Win7 я могу подтвердить то, что сказал @David: установка Enabled на False отключает элемент, но также меняет цвет элементов на серый. Разница не очень бросается в глаза, если цвет шрифта стандартный clBlack, но все же виден.   -  person Tom Brunberg    schedule 22.09.2016
comment
Да, это странно, но мне все еще нужно найти обходной путь для этого... Есть ли шанс изменить цвет узла для этих отключенных элементов?   -  person astack    schedule 22.09.2016
comment
@astack - Вы можете рисовать предметы самостоятельно. Вы, вероятно, должны выяснить, почему включенное не работает. Вы пробовали с совершенно новым проектом?   -  person Sertac Akyuz    schedule 22.09.2016
comment
Найдите обходной путь для чего? Слабая разница в оттенке? Нарисуйте элемент самостоятельно и закрасьте отключенные элементы любым оттенком или цветом, который вы хотите (Windows использует включенные/выключенные цвета по умолчанию, с которыми пользователь уже должен быть знаком). Включено работает нормально; он предотвращает выбор и изменяет затенение элемента, чтобы показать, что он отключен.   -  person Ken White    schedule 23.09.2016


Ответы (1)


Чтобы отключить узел, установите для его свойства Enabled значение False. Отключенный элемент отображается серым цветом.

Чтобы изменить обычный цвет текста узлов, измените TTreeView.Font.Color.

Чтобы изменить цвет текста отключенных узлов, используйте OnCustomDrawItemevent:

procedure TForm2.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if cdsDisabled in state then
    Sender.Canvas.Font.Color := clRed; //cl3DLight;
end;

Настройки цвета по умолчанию:

введите здесь описание изображения

Отключенный цвет = cl3DLight:

введите здесь описание изображения

Обычный цвет текста = clGreen и отключенный цвет = clRed:

введите здесь описание изображения

person Tom Brunberg    schedule 22.09.2016
comment
Возможно, было бы неплохо прокомментировать Enabled. Так что будущие читатели могут знать, что это действительно работает. - person David Heffernan; 23.09.2016
comment
Я сделал это точно так же, как вы, и это работает для меня. Сначала я отключил правильные узлы в своем древовидном представлении, а затем использовал событие OnCustomDrawItem, чтобы покрасить эти узлы в серый цвет. Спасибо! - person astack; 23.09.2016