Comunidad Gambas-es

Versión completa: Clase ContainerChildren ¿Alguien sabe cómo usarla?
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
¿Y en qué se diferencia de la clase Children?

Estoy intentando mejorar una serie de funciones que revisan todos los controles de un formulario y he visto que existe esa clase que no había visto nunca... pero no hay ni una pequeña ayuda de cómo usarla.

¿Alguien tiene alguna idea?

Saludos
(30-10-2022, 19:31)Shordi escribió: [ -> ]¿Alguien tiene alguna idea?

No tengo idea, TercoIDE es el de las clases   Big Grin
(30-10-2022, 22:18)tincho escribió: [ -> ]No tengo idea, TercoIDE es el de las clases

Estoy aprendiendo. Y tengo algunos problemas con los Children en mis programas. Se portan mal.
(31-10-2022, 15:15)tercoide escribió: [ -> ]
(30-10-2022, 22:18)tincho escribió: [ -> ]No tengo idea, TercoIDE es el de las clases

Estoy aprendiendo. Y tengo algunos problemas con los Children en mis programas. Se portan mal.

Mándalos al rincón de pensar...

Cool
Que bueno.

ContainerChildren :This virtual class returns a virtual collection of all children of a container.

Propiedades: Count y Max
Métodos: Clear 

Se puede asignar los hijos de un contenedor a  un tipo ContainerChildren

GAMBAS
  1. Public Sub Form_Open()
  2.  
  3.   Dim hijos As ContainerChildren
  4.   Dim ob As Object
  5.  
  6.   hijos = Panel1.Children
  7.  
  8.   Print "El Panel1 tiene " & Str(hijos.Count) & " hijos"
  9.  
  10.   For Each ob In hijos  
  11.     Print "Un hijo se llama: " & ob.name
  12.   Next
  13.  



Y se puede asignar a un control mediante un tipo ContainerChildren y su indice.

GAMBAS
  1. Public Sub Ejemplo2()
  2.  
  3.  
  4.   Dim hijos As ContainerChildren
  5.   Dim hcontrol As Control
  6.  
  7.   hijos = Panel1.Children
  8.  
  9.   hcontrol = hijos[0]
  10.  
  11.   Print hcontrol.Name
  12.   



Saludos
(30-10-2022, 19:31)Shordi escribió: [ -> ]Estoy intentando mejorar una serie de funciones que revisan todos los controles de un formulario y he visto que existe esa clase que no había visto nunca... pero no hay ni una pequeña ayuda de cómo usarla.

¿Pero que es lo que quieres hacer exactamente?
No es lo mismo una clase que un objeto.
Por ejemplo yo lo uso de la siguiente manera para asignar la imagen de un ToolButon que se encuentra dentro de un panel 
GAMBAS
  1. Public Sub LoadIcons(h As Container)
  2.  
  3.   Dim obj As Object
  4.  
  5.   For Each obj In h.Children
  6.     If Object.Type(obj) = "ToolButton" Then
  7.       obj.Picture = dsk.TagPic(obj.Tag, 32)
  8.     Endif
  9.   Next
  10.  


Otro ejemplo que es mas general y sirve para asignar la imagen a cada ToolButton que exista en el formulario pero podrías adaptarlo a lo que requiera tu programa ya que al ser recursivo se llama a si mismo y continua hasta el ultimo control que encuentre en el formulario.

GAMBAS
  1. Public Sub Form_Open()
  2.  
  3.   RScan(Me)
  4.  
  5.  
  6. Private Sub RScan(obj As Object)
  7.  
  8.   Dim chi As Object
  9.   Dim chi2 As Object
  10.  
  11.   For Each chi In obj.Children
  12.     If Object.Type(chi) = "ToolButton" Then
  13.       chi.Picture = dsk.TagPic(chi.Tag, 32)
  14.     Else
  15.       For Each chi2 In chi.Children
  16.         If Object.Type(chi2) = "ToolButton" Then
  17.           chi2.Picture = dsk.TagPic(chi2.Tag, 32)
  18.         Else
  19.           RScan(chi2)
  20.         Endif
  21.       Next
  22.     Endif
  23.   Next


Shell, este código es muy útil, gracias. Espero que no te importe pero lo he modificado y añadido a la ayuda de Gambas en Inglés
(02-11-2022, 22:37)tincho escribió: [ -> ]¿Pero que es lo que quieres hacer exactamente?
No es lo mismo una clase que un objeto.
Por ejemplo yo lo uso de la siguiente manera para asignar la imagen de un ToolButon que se encuentra dentro de un panel 
GAMBAS
  1. Public Sub LoadIcons(h As Container)
  2.  
  3.   Dim obj As Object
  4.  
  5.   For Each obj In h.Children
  6.     If Object.Type(obj) = "ToolButton" Then
  7.       obj.Picture = dsk.TagPic(obj.Tag, 32)
  8.     Endif
  9.   Next
  10.  

Sí, cosas así ya tengo hechas usando, como en el ejemplo, Children pero sigo sin entender la utilidad de ContainerChildren. Creí que podía ahorrame esos bucles y la recursividad si ContainerChildren incluía "de manera nativa" todos los children de todos los Container contenidos en el objeto inicial... pero ya veo que no.

La única utilidad que le veo es la posibilidad de pasar como referencia la clase Children "desligándola" del objeto padre... pero sigue siendo algo bastante oscuro.

Saludos