TControlState.csDesignerHide vs. TControlStyle.csNoDesignVisible
delphi, vcl
Solution
Summary
Use `TControlState.csDesignerHide` to prevent the control from drawing.
Use `TControlStyle.csNoDesignVisible` to mimic runtime behaviour of the `Visible` property.
Elaboration
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`,
- in addition to those methods, `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`:
- All with default settings
- `StateControl1.DesignerHide = True`
- `StyleControl1.NoDesignVisible = True` and `StyleControl1.Visible = False`
Problem
The VCL seems to offer two mechanisms for hiding controls from form designers : `TControlState.csDesignerHide` and `TControlStyle.csNoDesignVisible`. What's the difference between them as far as the IDE is concerned? Which should you use when?