Shell   03-05-2023, 00:21
#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.

Código:
'Actualmente no los elimina, los oculta
Private afigures As New PictureBox[] 'Almacenará todos los picturebox
Private indice As Integer

Public Sub Form_Open()
 
  Me.Title = "Eliminar control de su contenedor"
  Panel1.Arrangement = Arrange.Row
 
End

Public Sub CrearFigura(tipo As Integer)
 
  Dim pfigura As PictureBox
 
  pfigura = New PictureBox(Panel1) As "Figura"
  Select Case tipo
    Case 1
       pfigura.Picture = Picture.Load(Application.Path &/ "circulo.png")
    Case 2
      pfigura.Picture = Picture.Load(Application.Path &/ "cuadrado.png")
  End Select
  With pfigura
    .Tooltip = "Haz click para eliminarlo del panel"
    .w = 64
    .H = 64
    .Tag = indice    
  End With
  indice += 1
  afigures.Add(pfigura)
 
End

Public Sub BotonesCreadores_Click()
 
  'Crea un circulo "1" o un cuadrado "2"
  CrearFigura(Last.tag)
 
End

Public Sub Figura_MouseDown()
 
  'Se oculta el último picturebox en el que se ha hecho click dentro de el
  Last.Hide
 
End

Subo el ejemplo.

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

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   03-05-2023, 08:53
#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
Shell   03-05-2023, 15:03
#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
Última modificación: 03-05-2023, 15:39 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   03-05-2023, 17:17
#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
cogier   03-05-2023, 20:00
#5
Prueba este código: -

Código:
HPanel1 As HPanel
HBox1 As HBox
Button1 As Button
Button2 As Button
Panel1 As Panel
hLabel As Label
hButton As Button

Public Sub Form_Open()

  BuildForm

End

Public Sub Button1_Click()

  With hButton = New Button(HPanel1) As "Items"
    .H = 56
    .W = 56
    .Font.Bold = True
    .Font.Size = 20
    .Text = Str(HPanel1.Children.Count)
    Me.Title = "HPanel1.Children.Count = " & Str(HPanel1.Children.Count)
  End With

End

Public Sub Button2_Click()

  With hLabel = New Label(HPanel1) As "Items"
    .H = 56
    .W = 56
    .Font.Bold = True
    .Font.Size = 20
    .Border = Border.Plain
    .Alignment = Align.Center
    .Text = Str(HPanel1.Children.Count)
    Me.Title = "HPanel1.Children.Count = " & Str(HPanel1.Children.Count)
  End With

End

Public Sub Items_MouseDown()

  Last.Delete
  Me.Title = "HPanel1.Children.Count = " & Str(HPanel1.Children.Count)

End

Public Sub BuildForm()

  With Me
    .H = 400
    .W = 600
    .Padding = 5
    .Arrangement = Arrange.Vertical
  End With

  With HPanel1 = New HPanel(Me) As "HPanel1"
    .Expand = True
  End With

  With HBox1 = New HBox(Me) As "HBox1"
    .H = 28
    .W = 100
    .Invert = True
  End With

  With Button1 = New Button(HBox1) As "Button1"
    .H = 28
    .W = 128
    .Text = "Button"
  End With

  With Panel1 = New Panel(HBox1)
    .W = 35
  End With

  With Button2 = New Button(HBox1) As "Button2"
    .H = 28
    .W = 128
    .Text = "Label"
  End With

End
Shell   03-05-2023, 22:09
#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

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 3 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.