TControlState.csDesignerHide vs. TControlStyle.csNoDesignVisible

VCL, похоже, предлагает два механизма для скрытия элементов управления от разработчиков форм: TControlState.csDesignerHide и TControlStyle.csNoDesignVisible.

Какая разница между ними в отношении IDE? Что вы должны использовать, когда?

Ответ 1

Резюме

Используйте TControlState.csDesignerHide, чтобы предотвратить рисование элемента управления.

Используйте TControlStyle.csNoDesignVisible для имитации поведения среды выполнения Visible.

Разработка

Хороший вопрос! Там просто должна быть разница между ними, поэтому я сделал небольшое расследование.

Поиск использования в блоке Controls, мы находим, что:

  • TControlState.csDesignerHide используется в: TControl.InvalidateControl, TWinControl.UpdateShowing, TWinControl.PaintHandler, TWinControl.PaintControls,
  • в дополнение к этим методам, TControlStyle.csNoDesignVisible также используется в: TControl.Show, TControl.Repaint, TControl.CMVisibleChanged, TWinControl.AlignControls, TWinControl.ControlAtPos, TWinControl.CMVisibleChanged, TWinControl.GetControlExtents, TWinControl.CalcConstraints, TWinControl.CanAutoSize.

Таким образом, TControlState.csDesignerHide используется только в операциях рисования, тогда как TControlStyle.csNoDesignVisible также используется в операции позиционирования и выравнивания.

Другими словами, используйте:

  • TControlState.csDesignerHide, если вы хотите контролировать видимость,
  • TControlStyle.csNoDesignVisible, если вы также хотите контролировать присутствие.

Кроме того, TControlStyle.csNoDesignVisible работает только в сочетании с видимым свойством. Это не действует, когда Visible установлен True. (Обычно свойство Visible влияет только на поведение во время выполнения).

Чтобы проиллюстрировать разницу, получим три снимка экрана конструктора форм. На форме размещены слева направо: "TStyleControl" с элементом управления, управляющим TControlStyle.csNoDesignVisible, панелью, "TStateControl" с управляющим свойством TControlState.csDesignerHide и другой Panel, все с атрибутом Align, установленным на alLeft:

enter image description here

  • Все с настройками по умолчанию
  • StateControl1.DesignerHide = True
  • StyleControl1.NoDesignVisible = True и StyleControl1.Visible = False