Eliminar Un Objeto De Su Contenedor Padre


Objetivo: Eliminar Un Objeto De Su Contenedor Padre
Buenas!.

Después de ver el mensaje de GambaFeliz en este post:

Problema con los indices en un contenedor padre al eliminar objetos contenidos

Antes de nada diré. ¿ No decimos que la propiedad Children devuelve una colección ?. ¿ Es realmente una colección o es un array ?.
Aparenta ser más un array de controles, que no una colección de controles..

Tengo un formulario con una matriz de n botones de ancho por n botones de alto. Y quiero eliminar o hacerlos "invisibles" con el ratón los que quiera.
La parte importante es esta, pero fijaros en el comentario que digo de la propiedad visible del control botón y su padre Panel.

Sobre todo es importante que tengamos en cuenta la propiedad "Tag".

Public Sub Observador_Click()

Dim unboton As Button
Dim indice As Integer

indice = Last.tag

For Each unboton In Panel1.Children
'Eliminar el botón del panel
'If unboton.tag = indice Then unboton.Delete

' ¿ Y si quieres hacerlo invisible ?. Si usas la propiedad visible, desparece de la vista del contenedor padre pero no evita que se redistribuyen los "niños"
'Entonces...y si lo hacemos invisible de otra forma...B-D

If unboton.Tag = indice Then
With unboton
.Border = Border.None
.Tag = ""
.Text = ""
End With
Endif

Next

End


Haciéndolos "invisibles"

eliminarhaciendoinvisible

Y eliminando los que queramos del panel.

eliminandolodeltodo

Saludos

última edición por Shell el Viernes, 26 Junio 2020, 13:31; editado 1 vez

ObjetosEnPanel-0.0.1.tar.gz
Descripción: Eliminar o hacer invisibles botones dentro de un contenedor Panel 
Descargar
Nombre del archivo: ObjetosEnPanel-0.0.1.tar.gz
Tamaño: 12.12 KB
Descargado: 218 veces

Objetivo: Re: Eliminar Un Objeto De Su Contenedor Padre
Preguntaros esto:

Si la propiedad Children fuera una colección. ¿ Tengo necesidad de recorrer "todo" los elementos para hacer algo concreto con un solo objeto ?.

El código sigue teniendo un problema al cambiar el tag a texto, quiere un entero (eso en el caso de querer que sean invisibles)....
Habrá que saber si ya fue pulsado el botón o eliminar la nueva asignación de tag dentro del with.

De todas formas a lo mejor puede no interesar que se vuelva a comprobar algo que ya se ha pulsado .

Saludos

última edición por Shell el Viernes, 26 Junio 2020, 13:46; editado 1 vez
Objetivo: Re: Eliminar Un Objeto De Su Contenedor Padre
Se puede añadir un array global tal que este:

...
Private pulsados As New Boolean[]
...


En el form_open() cambiar el tamaño de este según el número de botones alto x ancho


pulsados.Resize(BOTONESXANCHO * BOTONESXALTO)



Y ademas evita un nuevo recorrido si ya se ha pulsado el botón..

Public Sub Observador_Click()

Dim unboton As Button
Dim indice As Integer

indice = Last.tag

If pulsados[indice] = False Then

For Each unboton In Panel1.Children
'Eliminar el botón del panel
'If unboton.tag = indice Then unboton.Delete

' ¿ Y si quieres hacerlo invisible ?.
' Si usas la propiedad visible, desparece de la vista del contenedor padre pero no evita que se redistribuyen los "niños"
' Entonces...y si lo hacemos invisible de otra forma...B-D

If unboton.Tag = indice Then
pulsados[unboton.Tag] = True
With unboton
.Border = Border.None
.Text = ""
End With
Endif
Next
Endif

End



Podía haber usado en la comprobación..

If Not pulsados[indice] Then



Saludos

última edición por Shell el Viernes, 26 Junio 2020, 13:58; editado 1 vez
Objetivo: Re: Eliminar Un Objeto De Su Contenedor Padre
Y dicho sea de paso para que no veamos como reacciona el botón "invisible"....podemos poner la propiedad "enable" a "False" del botón:

....
If unboton.Tag = indice Then
pulsados[unboton.Tag] = True
With unboton
.Border = Border.None
.Text = ""
.Enabled = False
End With
Endif
...


Y con esto y un bizcocho, buen fin de semana a todos..no corráis..

Saludos

última edición por Shell el Viernes, 26 Junio 2020, 14:05; editado 1 vez
Objetivo: Re: Eliminar Un Objeto De Su Contenedor Padre
Shell escribió:  
Buenas!.

Después de ver el mensaje de GambaFeliz en este post:

Problema con los indices en un contenedor padre al eliminar objetos contenidos

Antes de nada diré. ¿ No decimos que la propiedad Children devuelve una colección ?. ¿ Es realmente una colección o es un array ?.
Aparenta ser más un array de controles, que no una colección de controles..


Pero que busca boca eres

Si, es un array, sin duda, yo no me he leído ahora a mi mismo, suelo meter la pata en palabras simplemente por que se lo que pienso pero no lo expreso por escrito. Y si, soy un desastre con los conceptos, pero cuando programo y tengo una meta, suelo llegar a ella "como sea", así soy yo.

Mil disculpa por la cagada.

Nota: Tras leerte has escrito mucho pero al final no has respondido por código con el título de tu hilo "Eliminar un objeto de su contenedor padre", se que lo haces en alusión a mi hilo, pero no lo aclaras según tu forma de programa, chupate esa (supongo que entiendes que es broma y no lo veas como otros, que dicen de mi algo como que yo trato el foro como una verdulería, que curiosamente hay que leer bien el hilo para pensar quien es el verdulero y quien es el que compra verduras, en fin, lo que tengo claro es quien soy yo)

Aaadios

última edición por gambafeliz el Viernes, 26 Junio 2020, 19:41; editado 1 vez
Perfil MP  
Objetivo: Re: Eliminar Un Objeto De Su Contenedor Padre
GambaFeliz:

Citar:

Nota: Tras leerte has escrito mucho pero al final no has respondido por código con el título de tu hilo "Eliminar un objeto de su contenedor padre", se que lo haces en alusión a mi hilo, pero no lo aclaras según tu forma de programa, chupate esa (supongo que entiendes que es broma y no lo veas como otros, que dicen de mi algo como que yo trato el foro como una verdulería, que curiosamente hay que leer bien el hilo para pensar quien es el verdulero y quien es el que compra verduras, en fin, lo que tengo claro es quien soy yo)


Ah, es que me gustó mas hacerlo invisible el botón.

Eliminar el botón del contenedor era más sencillo. Aunque al principio también me costó entenderlo.
Me encontré el problema de los indices, como van cambiando según eliminas controles.

El recorrido es obligatorio y más lento al ser un array. Pero...encontré otra forma mejor si quieres eliminar.

Const BOTONESXANCHO As Integer = 5
Const BOTONESXALTO As Integer = 5

Public Sub Form_Open()

Dim unboton As Button
Dim i As Integer
Dim anchoboton As Integer
Dim altoboton As Integer

Me.Title = "Eliminar objeto del Panel"
With Panel1
.Arrangement = Arrange.Column
.Expand = True
End With

anchoboton = Me.w / BOTONESXANCHO
altoboton = Me.H / BOTONESXALTO

For i = 0 To BOTONESXANCHO * BOTONESXALTO - 1
unboton = New Button(Panel1) As "Observador"
With unboton
.W = anchoboton
.H = altoboton
.Text = "Botón " & (i + 1)
.Tooltip = "Haz click en mi"
End With

Next

End


Public Sub Observador_Click()

'Con esto es suficiente. Tampoco se necesita usar la propiedad tag
Last.Delete

End

Public Sub Form_Resize()

Dim unboton As Button

'Ajustamos el tamño de todos los botones al cambiar el tamaño del formulario
For Each unboton In Panel1.Children
With unboton
.W = Me.w / BOTONESXANCHO
.H = Me.H / BOTONESXALTO
End With
Next

End


Subo una modificación del código. He abreviado más el código.

Comenta si este te parece más acorde.

¿ Te interesa más eliminar con un indice ?.

Saludos


EliminaObjetosDentroDelPanel-0.0.1.tar.gz
Descripción: Elimina objetos de un panel 
Descargar
Nombre del archivo: EliminaObjetosDentroDelPanel-0.0.1.tar.gz
Tamaño: 11.83 KB
Descargado: 201 veces

Objetivo: Re: Eliminar Un Objeto De Su Contenedor Padre
Ya Shell pero tu caso es para controles que son visibles para el usuario pero mi caso y quizás no te lo he dicho en ninguna para es para controles no visibles para el usuario que es fundamental que el programador los destruya por completo para crearlos nuevamente según su necesidad, algo como creo 2 controles y después los destruyo para volverlo a crear 2 o 4 nuevos con el name 1, 2 o 1, 2, 3, 4

Son cosas que necesitaba, pero que mi sorpresa fue cuando intentaba destruirlos y noté que cuando usaba For-Next para recorrerlo y destruía el primero creado pues no podía destruir el segundo por que iba con un orden de indice incrementado. Y es cuando noté que debía destruirlo con For-Next Step y después todo funcionó.

Y como bien decías efectivamente esto me ocurría por que era un array de controles.

Muchas gracias por tu extenso aporte.

Aaadios

Perfil MP  
Objetivo: Re: Eliminar Un Objeto De Su Contenedor Padre
GambaFeliz:

Cuando tu veas que tienes un problema con un código y no quieres subir todo un proyecto, por ser algo personal, por motivos distintos,
son proyectos que en principio pues son tuyos y por otra parte no a todos nos valen los proyectos de otros usuarios.
Imagina subir todo un proyecto enorme, no es necesario para centrarnos en una parte determinada.

Intenta subir un pequeño código donde demuestras el error para que podamos testearlo todos los que podamos ayudarte
sin ser todo el proyecto, solo una forma de demostrar el error. Esto vale para todos nosotros.

Por otra parte ya no es solo por el error y su solución, otros compañeros pueden darte una mejora que te puede interesar.
Si tu conoces una forma de hacer las cosas, otro usuario puede enseñarte otra posibilidad de llegar al mismo
lugar.

A mi me gusta ayudar, ya que a la vez que ayudo , aprendo.
Mi problema es que me anticipo mucho, eso me motiva en parte, pero debería de hacerlo de otra forma,
tomarlo con más tranquilidad...soy muy inquieto...

Saludos


Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.3076s (PHP: -49% SQL: 149%)
Consultas SQL: 52 - Debug off - GZIP Activado