WP, this checks only Form's direct children.
No, it checks all components owned by the form, and this usually includes all controls sitting directly or indirectly on the form (I do agree that there may be some rare crazy cases where somebody might make the form own a control parented by another form...)
I see, I though you used Components property (instead of Controls) by accident, sorry.
You are right, although my version is still cleaner -- at least for these "rare crazy cases" -- actually, although I don't think I would ever have controls created by another form, it is not rare that I (when creating controls in code) create some controls with nil owner (and take care myself of destroying these correctly it in code), or put a panel or some other control as the owner.
I also did one thing wrong -- when converting your procedure, I replaced Components with Controls, but kept the line
if WC.Controls[I] is TControl then
, which is now completely unnecessary, although it makes no harm. I really don't like this -- looks like overdefensive programming style, which is just a bad style.