The VCL seems to offer two mechanisms for hiding controls from form designers : TControlState.csDesignerHide
and TControlStyle.csNoDesignVisible
.
Use TControlState.csDesignerHide
to prevent the control from drawing.
Use TControlStyle.csNoDesignVisible
to mimic runtime behaviour of the Visible
property.
Nice question! There simply must be a difference between them, so I did a little investigation.
Searching for usage in the Controls
unit, we find that:
TControlState.csDesignerHide
is used in: TControl.InvalidateControl
, TWinControl.UpdateShowing
, TWinControl.PaintHandler
, TWinControl.PaintControls
,TControlStyle.csNoDesignVisible
is also used in: TControl.Show
, TControl.Repaint
, TControl.CMVisibleChanged
, TWinControl.AlignControls
, TWinControl.ControlAtPos
, TWinControl.CMVisibleChanged
, TWinControl.GetControlExtents
, TWinControl.CalcConstraints
, TWinControl.CanAutoSize
.Thus TControlState.csDesignerHide
is only used in painting operations whereas TControlStyle.csNoDesignVisible
is also used in position and alignment operation.
In other words, use:
TControlState.csDesignerHide
if you only want control over visibility,TControlStyle.csNoDesignVisible
if you also want control over presence.Furthermore, TControlStyle.csNoDesignVisible
works only in conjuction with the Visible property. It has no effect when Visible is set True. (Normally, the Visible property only affects runtime behaviour).
To illustrate the difference, hereby three screen shots of a form designer. On the form are placed from left to right: a "TStyleControl
" with a property controlling TControlStyle.csNoDesignVisible
, a Panel, a "TStateControl"
with a property controlling TControlState.csDesignerHide
and another Panel, all with the Align property set to alLeft
:
StateControl1.DesignerHide = True
StyleControl1.NoDesignVisible = True
and StyleControl1.Visible = False