Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Eliminar Objetos en tiempo de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=70766)

adeszeus 09-11-2010 21:43:19

Eliminar Objetos en tiempo de ejecucion
 
Buenas tardes a todos, vengo con una enorme duda, estoy creando objetos en tiempo de ejecucion todo hasta ese punto esta bien y no existe ningun problema, pero si quiero volver a refrescar la informacion, y recargar todos los objetos apartir de la nueva informacion sumistrada, pienso que lo util seria eliminarlos, para evitar errores dado que estan los objetos funcionando bien, pero cambia cierta informacion... y quisiera eliminarlos, todo estos son groupbox intente este codigo

Código Delphi [-]
  if Components[i] is TGroupBox then
  TGroupBox(Components[i]).Destroy;
eso esta claro dentro de un ciclo for.... me elimina unos cuantos pero otros me los salta, alguien puede decirme que estoy haciendo mal?

rgstuamigo 09-11-2010 22:03:55

Para liberar y destruir objetos en Delphi, no se debe llamar directamente al destructor ,sino mas bien al método Free, éste ya se encarga de llamar internamente al destructor, no sin antes hacer algunas cosas adicionales..;)
En otras palabras tu código anterior quedaría de ésta forma:

Código Delphi [-]
if Components[i] is TGroupBox then
  TGroupBox(Components[i]).Free;//<- ;)
Saludos...:)

marcoszorrilla 09-11-2010 22:29:22

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
I:Integer;
begin
  For i:=ComponentCount -1 downto 0 do
  begin
   if Components[i] is TGroupBox then
   Components[i].free;
  end;
end;

He comprobado que si vas de abajo hacia arriba la lista de componentes se vuelve inválida al borrar alguno de ellos, por esto he hecho una prueba recorriendo la lista al revés y funciona.

Un Saludo.

adeszeus 09-11-2010 22:36:53

Solucionado
 
Gracias me ha sido muy util, pensar que solo mi error era por la manera de correr el ciclo.

Gracias

ecfisa 09-11-2010 22:52:50

Hola adeszeus.

Además de lo dicho por rgstuamigo, cosa muy cierta ya que Free verifica la existencia del objeto antes de liberarlo, tambíen es importante
el sentido en que se ejecute el ciclo for.
Si lo haces de este modo:
Código Delphi [-]
   for i:= 0 to ComponentCount -1 do
Corres el riesgo de obtener errores de índice o que no se liberen algunos componentes.
Ya que cuando el un componente es borrado, la posición que tenía es ocupada inmediatamente por el componente sucesor.
Supongamos Components[1] ( componente 'A') es liberado; el componente 'B' ocupa su lugar.
Cuando vaya a liberar Components[2] en realidad estará liberando el 'C'. Y así sucesivamente...


Lo correcto sería:
Código Delphi [-]
   for i:= ComponentCount - 1 downto 0 do

Saludos.:)

Edito: Veo que marcos fué más rápido en editar. ( la mala costumbre de no recargar la página... :D )

adeszeus 09-11-2010 22:54:18

Gracias !!!!
 
Pues Muchas Gracias por el tip, me han explicado una duda que tenia de hace tiempo, jajajaja, en fin ha sido disipada y pues gracias por el tip y explicacion de la eliminacion de objetos

rruffino 25-11-2010 14:10:12

Una consulta al tema
 
Hola a todos, he estado leyendo esto y lo he aplicado porque lo necesitaba. Yo tengo en el Form varios Labels, algunos creados en tiempo de diseño y otros en tiempo de ejecución. Utilizando el código antes mostrado por marcos me elimina todos los componentes labels del Form. Quería saber si se pueden eliminar solo aquellos Label que fueron creados en tiempo de ejecución y cuya cantidad es aleatoria.
Desde ya agradezco la respuesta.
Saludos!!!:p

adeszeus 25-11-2010 15:17:09

Intenta con un ciclo
 
Supongo que tus objetos creados en tiempo de ejecucion son Con cierto nombre independiente al predefinido por Delphi (Labels) y despues de esto con un numero consecutivo, por que no lo realizas con un ciclo e ir eliminando los objetos de esa manera, identificandolos por el nombre y despues por su numero de indice y despues liberarlo, eso es lo que mejor se me ocurre. Puedes intentar esto que solucionamos en otro post

http://www.clubdelphi.com/foros/showthread.php?t=70770


La franja horaria es GMT +2. Ahora son las 20:11:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi