15 сентября 2021

Delphi 11. Поддержка CheckBox'ов в узлах TTreeView

    В Delphi 11 Alexandria разработчики сделали одну из самых существенных за много лет доработок контрола для отображения древовидных структур TTreeView. Наконец-то его узлы (TTreeNode) могут быть CheckBox'сами.
    В Delphi 11 классу TTreeNode добавили два новых свойства:
  • CheckState - состояние CheckBox'а:
    property CheckState: TNodeCheckState read GetCheckState write SetCheckState;
    где TNodeCheckState это
    TNodeCheckState = (ncsNone, ncsUnchecked, ncsChecked, ncsPartial, ncsDimmed, ncsExclusion);
    • ncsNone – узел без CheckBox'а;
    • ncsUnchecked – галочка не установлена (по умолчанию);
    • ncsChecked – галочка установлена;
    • ncsPartial – маленький квадрат;
    • ncsDimmed – установлена тусклая галочка;
    • ncsExclusion – крестик.
  • Checked - переключатель свойства CheckState между состояниями ncsUnchecked и ncsChecked:
    property Checked: Boolean read GetChecked write SetChecked;
По умолчанию в TTreeView для свойства узла CheckState используется только три варианта состояния: ncsNone, ncsChecked и ncsUnchecked. Но через published свойство TTreeView.CheckStyles дереву можно добавить использование остальных состояний. Свойство CheckStyles наследуется от TCustomTreeView и имеет тип TCheckStyles:
TCheckStyle = (csPartial, csDimmed, csExclusion);
TCheckStyles = set of TCheckStyle;
Для того чтобы TTreeView начал отображать в узлах дерева CheckBox'ы достаточно его published свойству CheckBoxes присвоить значение True.
    Для наглядности я упростил стандартный "TTreeVew CheckBox Demo" и добавил в дерево узел "TNodeCheckState" со всеми вариантами состояния CheckBox'а:
Delphi 11 - CheckBox в узлах TTreeView
Несколько примечаний к этой копии экрана:
  1. дерево отображает CheckBox'ы даже в дизайнере форм (это видно по форме на заднем плане);
  2. у задизейбленного узла "C++Builder" можно менять состояние CheckBox'а;
  3. мой глаз не смог отличить состояние ncsDimmed от ncsChecked.
    Для контроля изменения состояния CheckBox'ов разработчики Delphi добавили в TCustomTreeView обработчики двух событий:
  • OnCheckStateChanging – срабатывает перед изменением состояния и позволяет проконтролировать его изменение
    TTVCheckStateChangingEvent = procedure(Sender: TCustomTreeView; Node: TTreeNode;
        NewCheckState, OldCheckState: TNodeCheckState; var AllowChange: Boolean) of object;
  • OnCheckStateChanged – срабатывает после изменения состояния
    TTVCheckStateChangedEvent = procedure(Sender: TCustomTreeView; Node: TTreeNode;
        CheckState: TNodeCheckState) of object;

Комментариев нет:

Отправить комментарий