Delphi’s VCL has a very useful class, CustomControl. This class is a direct base class of Control, which is equivalent to C# WF’s UserControl.
For those, who are not familiar with VCL, CustomControl differs very little from Control; the main difference is that most of properties are protected; when implementing the new control, developer may decide, which ones does he want to publish and which ones shall remain hidden.
I’m developing my own control for Windows Forms and I want to hide some properties and events. For instance, I don’t want to expose the MouseDown event – instead I allow capturing clicking on control’s elements.
Is there an equivalent of VCL’s CustomControl in Windows Forms? If not, how can I hide unwanted public properties and events in my control?
In response to answers:
This is not a matter of security, but rather a matter of code elegance. In Delphi I can derive from CustomControl, leave the OnMouseDown event protected (as in C#’s protected) and say to the control’s user:
You cannot use OnMouseDown, because there is none. If you want to react to user clicking on control, simply use OnElementClicked – you’ll even get detailed information about which element was clicked and what was its state.
I may disable calling the MouseDown event as Hans Passant suggested, but then I would have to include the following in the control’s user’s manual:
Please do not use the MouseDown event, because I’ve overridden the OnMouseDown method, such that it won’t call the MouseDown event. This is because the control’s logic is designed in such way, that you should use OnElementClicked rather than OnMouseDown. Please don’t criticize the control because of MouseDown not working. Please don’t report it as a bug, because it is by design. Please don’t post messages in forums or create blog entries explaining how to fix the MouseDown problem by inheriting the class and manually calling the MouseDown event, because it would break the control’s logic. Pleas don’t… damnit, told you so!
If someone actually inherits from my control – I assume then, that he knows, what he’s doing (also because one would then gain access to my control’s internal logic as well). But if someone just uses my control, I would give him only these properties, events and methods, that I’m sure will work as designed.
I hope it explains my motives 🙂
There’s a fundamental difference between hiding, what you asked for, and making it inaccessible, what I assume Delphi does. Hiding is simple, just repeat the declaration and apply attributes:
Which prevents the event from being displayed in the Properties window, it won’t show up in the IntelliSense dropdown and generates a compile error when he tries to assign the event in code anyway.
It is however not an absolute guarantee that the client programmer couldn’t work around the restriction anyway. By casting or overriding your class for example. But the ultimate backdoor is implementing the IMessageFilter interface, nothing you can do about that. So this ought to be good enough if elegance is the goal.