Hola crustaceos.
Para recorrer los controles de un formulario de forma recursiva les planteo este método que me viene dando buenos resultados.
Código:
'' Este método recibe un objeto como parámetro de entrada y devuelve ,por la
'' salida estándar, el tipo de objeto, el objeto padre y, si existen, los
'' simbolos Text, Value y Tag. Es un método recursivo puesto que si el objeto
'' tiene hijos se llama a si mismo y pasa el contenedor como parametro. Esta
'' pensado para recorrer controles de un formulario que inicialmente se pasa
'' como parametro, y luego recorrer hasta el último nivel de anidamiento en
'' el que exista un control.
'' *eng* This method takes an object as an input parameter and returns, via
'' standard output, the type of the object, the parent object, and, if they
'' exist, the symbols Text, Value, and Tag. It is a recursive method since if
'' the object has children it calls itself and passes the container as a
'' parameter. It is intended to loop through form controls, this form is
'' initially passed as a parameter, and then loop through to the last nesting
'' level in which a control exists.
Public Sub Looper(ob As Object)
Dim ch As Object
Dim sTag, sVal As String
Dim cls As Class
Dim aSymbols As New String[]
Dim sMark As String
Select Object.Class(ob).Parent.Name
Case "Form", "Container", "UserContainer"
For Each ch In ob.Children
Looper(ch)
Next
Case "Control", "UserControl", "TextBox", "Label"
sMark = ""
cls = Classes[Object.Class(ob).Parent.Name]
If cls.Symbols.Exist("Tag") Then
If ob.Tag = "" Then
aSymbols.Add("Symbol.Tag.Empty")
Else
aSymbols.Add("Symbol.Tag." & ob.Tag)
Endif
Else
aSymbols.Add("Symbol.Tag.None")
Endif
If cls.Symbols.Exist("Text") Then
If ob.Text = "" Then
aSymbols.Add("Symbol.Text.Empty")
Else
aSymbols.Add("Symbol.Text." & ob.Text)
Endif
Else
aSymbols.Add("Symbol.Text.None")
Endif
If cls.Symbols.Exist("Value") Then
If ob.Value <> 0 Then
aSymbols.Add("Symbol.Value." & CStr(ob.Value))
Else
aSymbols.Add("Symbol.Value.Empty")
Endif
Else
aSymbols.Add("Symbol.Value.None")
Endif
Case Else
sMark = "#"
End Select
Print sMark & Object.Class(ob).Parent.Name & ":" & Object.Class(ob).Name & ":" & aSymbols.Join(":")
End