Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

¿ Eliminar u ocultar los controles de su contenedor ?
#1

Buenas!

Tengo que eliminar una serie de controles en un contenedor. Pero la eliminación de estos es un poco más complicado que ocultarlos.
Por otro lado cuando se elimina un control, ¿ se elimina o queda invalido ?.

He creado este ejemplo. En un panel añado picturebox desde los botones de abajo, su imagen varia dependiendo si quiero que muestre
un círculo o un cuadrado.

Puedo ocultar cada uno de los controles, ¿ pero seria posible eliminarlos ?. Acordaros que los controles en su contenedor tienen un indice.
Si es un array, haceros a la idea de lo que quiere decir eso, cuando eliminas un elemento y lo que ocurre con sus indices.

Actualmente solo oculto los controles creados.

[Imagen: cBFL4iL.png]

Para eliminar se debe hacer click sobre la figura.

GAMBAS
  1. 'Actualmente no los elimina, los oculta
  2. Private afigures As New PictureBox[] 'Almacenará todos los picturebox
  3.  
  4. Public Sub Form_Open()
  5.  
  6.   Me.Title = "Eliminar control de su contenedor"
  7.   Panel1.Arrangement = Arrange.Row
  8.  
  9.  
  10. Public Sub CrearFigura(tipo As Integer)
  11.  
  12.   Dim pfigura As PictureBox
  13.  
  14.   pfigura = New PictureBox(Panel1) As "Figura"
  15.   Select Case tipo
  16.     Case 1
  17.        pfigura.Picture = Picture.Load(Application.Path &/ "circulo.png")
  18.     Case 2
  19.       pfigura.Picture = Picture.Load(Application.Path &/ "cuadrado.png")
  20.   With pfigura
  21.     .Tooltip = "Haz click para eliminarlo del panel"
  22.     .w = 64
  23.     .H = 64
  24.     .Tag = indice    
  25.   indice += 1
  26.   afigures.Add(pfigura)
  27.  
  28.  
  29. Public Sub BotonesCreadores_Click()
  30.  
  31.   'Crea un circulo "1" o un cuadrado "2"
  32.   CrearFigura(Last.tag)
  33.  
  34.  
  35. Public Sub Figura_MouseDown()
  36.  
  37.   'Se oculta el último picturebox en el que se ha hecho click dentro de el
  38.   Last.Hide
  39.  



Subo el ejemplo.

Saludos


Archivos adjuntos
.gz TestEliminarControlEnPanel-0.0.1.tar.gz Tamaño: 13.25 KB  Descargas: 1

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!
#2

En principio lo mismo da, supongo. Todo dependería del objetivo del programa y de su evolución ¿Hay que crear más controles luego? entonces quizá mejor ocultarlos y reutilizarlos, ¿Son demasiados y la memoria va creciendo? Entonces mejor eliminarlos, etc.

Saludos

No podemos regresar
    ¡Gracias!
#3

(03-05-2023, 08:53)Shordi escribió:  En principio lo mismo da, supongo. Todo dependería del objetivo del programa y de su evolución ¿Hay que crear más controles luego? entonces quizá mejor ocultarlos y reutilizarlos, ¿Son demasiados y la memoria va creciendo? Entonces mejor eliminarlos, etc.

Pues te cuento, en el test de las preguntas en inglés, tengo un panel, dentro de este, subpaneles por cada pregunta,
en cada subpanel contiene una etiqueta, una caja de texto y un textlabel.

Si creo diez preguntas y luego quiero volver a realizar otro test de diez preguntas, todos los subpaneles "deberían" ser eliminados
y creados de nuevo. Por eso creé este ejemplo a modo de prueba.

En el ejemplo de los picturebox que ves arriba, "podía" haber añadido en la propiedad tag de cada picturebox, un indice. Pero eso crea
un problema, si elimino el 5, el 6 debería pasar a ser el 5 y esto al final daría problemas con que no existe "tal" indice de elemento.
Eso en el caso de que se usase Panel.Children[indice].remove() o delete.

( En realidad todo esto son problemas muy básicos (eso creo) de no saber desarrollarlos, o peor estar obsesionado con realizarlo de una manera concreta y me quedo
"atrancado", cuando puede existir otra más sencilla ).

Para eliminar un hijo del contenedor estaba usando last.tag. Panel.Children[last.tag].remove(). Lógicamente eso da problemas.

Por otra parte el estar falto de practica, crea estos problemas.

P.d No se me había ocurrido reutilizarlos. El tiempo del borrado y la creación de nuevo puede ser una perdida de tiempo.

Saludos

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!
#4

No puedo decirte que es mejor, tan sólo que como principio general, el tag de un objeto es algo que el objeto "porta" (en otros lenguajes se le llama "cargo") pero que no usa ni necesita para su uso. El almacenar el él un número cuyo sentido es mantener un orden (el índice) habla de por sí de que no se han de borrar esos objetos. Ocúltalos y reutilízalos. Es más rápido, incluyente, ecosostenible y, si me apuras, feminista.


Big Grin Big Grin Big Grin Big Grin

Saludos

No podemos regresar
    ¡Gracias!
#5

Prueba este código: -

GAMBAS
  1. HPanel1 As HPanel
  2. HBox1 As HBox
  3. Button1 As Button
  4. Button2 As Button
  5. Panel1 As Panel
  6. hLabel As Label
  7. hButton As Button
  8.  
  9. Public Sub Form_Open()
  10.  
  11.   BuildForm
  12.  
  13.  
  14. Public Sub Button1_Click()
  15.  
  16.   With hButton = New Button(HPanel1) As "Items"
  17.     .H = 56
  18.     .W = 56
  19.     .Font.Bold = True
  20.     .Font.Size = 20
  21.     .Text = Str(HPanel1.Children.Count)
  22.     Me.Title = "HPanel1.Children.Count = " & Str(HPanel1.Children.Count)
  23.  
  24.  
  25. Public Sub Button2_Click()
  26.  
  27.   With hLabel = New Label(HPanel1) As "Items"
  28.     .H = 56
  29.     .W = 56
  30.     .Font.Bold = True
  31.     .Font.Size = 20
  32.     .Border = Border.Plain
  33.     .Alignment = Align.Center
  34.     .Text = Str(HPanel1.Children.Count)
  35.     Me.Title = "HPanel1.Children.Count = " & Str(HPanel1.Children.Count)
  36.  
  37.  
  38. Public Sub Items_MouseDown()
  39.  
  40.   Last.Delete
  41.   Me.Title = "HPanel1.Children.Count = " & Str(HPanel1.Children.Count)
  42.  
  43.  
  44. Public Sub BuildForm()
  45.  
  46.   With Me
  47.     .H = 400
  48.     .W = 600
  49.     .Padding = 5
  50.     .Arrangement = Arrange.Vertical
  51.  
  52.   With HPanel1 = New HPanel(Me) As "HPanel1"
  53.     .Expand = True
  54.  
  55.   With HBox1 = New HBox(Me) As "HBox1"
  56.     .H = 28
  57.     .W = 100
  58.     .Invert = True
  59.  
  60.   With Button1 = New Button(HBox1) As "Button1"
  61.     .H = 28
  62.     .W = 128
  63.     .Text = "Button"
  64.  
  65.   With Panel1 = New Panel(HBox1)
  66.     .W = 35
  67.  
  68.   With Button2 = New Button(HBox1) As "Button2"
  69.     .H = 28
  70.     .W = 128
  71.     .Text = "Label"
  72.  


[-] Los siguientes 3 usuarios dicen gracias a cogier por este post:
  • Grandamakulo, Shell, Shordi
    ¡Gracias!
#6

(03-05-2023, 17:17)Shordi escribió:  Ocúltalos y reutilízalos. Es más rápido, incluyente, ecosostenible y, si me apuras, feminista.

Big Grin Big Grin

Al final los he reutilizados como me dijiste. Viva la informática reciclable. Tongue
Podíamos crear un movimiento. Informáticos "re-verdes".

Saludos

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)