Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-11-2010
Avatar de adeszeus
adeszeus adeszeus is offline
Miembro
 
Registrado: abr 2010
Ubicación: San Mateo, Mexico (aun lado de Santa Maria y pasando el campo de futbol)
Posts: 47
Poder: 0
adeszeus Va por buen camino
Unhappy 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?
Responder Con Cita
  #2  
Antiguo 09-11-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

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...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #3  
Antiguo 09-11-2010
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #4  
Antiguo 09-11-2010
Avatar de adeszeus
adeszeus adeszeus is offline
Miembro
 
Registrado: abr 2010
Ubicación: San Mateo, Mexico (aun lado de Santa Maria y pasando el campo de futbol)
Posts: 47
Poder: 0
adeszeus Va por buen camino
Thumbs up Solucionado

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

Gracias
Responder Con Cita
  #5  
Antiguo 09-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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... )

Última edición por ecfisa fecha: 09-11-2010 a las 22:58:57.
Responder Con Cita
  #6  
Antiguo 09-11-2010
Avatar de adeszeus
adeszeus adeszeus is offline
Miembro
 
Registrado: abr 2010
Ubicación: San Mateo, Mexico (aun lado de Santa Maria y pasando el campo de futbol)
Posts: 47
Poder: 0
adeszeus Va por buen camino
Smile 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
Responder Con Cita
  #7  
Antiguo 25-11-2010
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Question 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!!!
Responder Con Cita
  #8  
Antiguo 25-11-2010
Avatar de adeszeus
adeszeus adeszeus is offline
Miembro
 
Registrado: abr 2010
Ubicación: San Mateo, Mexico (aun lado de Santa Maria y pasando el campo de futbol)
Posts: 47
Poder: 0
adeszeus Va por buen camino
Smile 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

Última edición por adeszeus fecha: 25-11-2010 a las 15:18:54. Razón: Agregar Info
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear Objetos en tiempo de ejecucion mmtaffarel OOP 8 14-01-2024 17:55:25
Agregar objetos a un GridPanel en tiempo de ejecución Luis Abraham Varios 2 25-06-2008 04:27:12
Dudas Crear Objetos en Tiempo de Ejecución Deiv OOP 9 09-08-2007 01:13:15
TClientDataSet y objetos de campos añadidos en tiempo de ejecución Berto2003 Conexión con bases de datos 2 04-03-2004 09:26:27
Objetos creados en tiempo de ejecución Scocc OOP 4 13-06-2003 20:55:29


La franja horaria es GMT +2. Ahora son las 12:33:46.


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
Copyright 1996-2007 Club Delphi