Πάρα πολύ σωστά!!!
Θα μπορούσε και χωρίς την χρήση του Delegate, αλλά με χρήση Delegate μπορούμε να πάρουμε κι' άλλα properties με τον ίδιο enumarator.
ΠΧ. ControlNames as String() ή ControlTags ή οτιδήποτε άλλο, κάνοντας την κλήση με άλλο method στο Delegate EnumerateControls(_Container.controls, New ProcessControlDelegate(AddressOf AddControlName))
Η Class με την εναλλακτική λύση σε VB (ομολογώ πολύ καλύτερη και σωστότερη από την αρχική. Μπράβο mns).
Public Class MyControlsCollection
Private _Controls As Collection
Private _Container As Object
Public Delegate Sub ProcessControlDelegate(ByVal a_Control As Control)
Public Sub New(ByVal Container As Object)
_Container = Container
End Sub
Public ReadOnly Property Controls() As Collection
Get
If _Controls Is Nothing Then
_Controls = New Collection
EnumerateControls(_Container.controls, New ProcessControlDelegate(AddressOf AddControl))
End If
Return _Controls
End Get
End Property
Public Sub EnumerateControls(ByVal a_Controls As Control.ControlCollection, ByVal a_Delegate As ProcessControlDelegate)
For Each control As Control In a_Controls
a_Delegate(control)
If IsContainer(control) AndAlso control.HasChildren Then
EnumerateControls(control.Controls, a_Delegate)
End If
Next
End Sub
Private Sub AddControl(ByVal Control As Control)
_Controls.Add(Control, Control.Name)
End Sub
Private Function IsContainer(ByVal ctl As Object) As Boolean
Dim des As System.ComponentModel.DesignerAttribute = _
TypeDescriptor.GetAttributes(ctl).Item(GetType(System.ComponentModel.DesignerAttribute))
If des Is Nothing Then Exit Function
Dim Base As System.Type = System.Type.GetType(des.DesignerTypeName.ToString)
Return Base.IsSubclassOf(GetType(System.Windows.Forms.Design.ParentControlDesigner))
End Function
End Class
Σταύρος Βαλσάμης
Προγραμματιστής