Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-11-2005
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
Ayuda con ControlCount

Hola amigos de la Comunidad de Delphi!, Hoy los molesto para que me ayuden con un problemita que tengo a la hora de liberar unos objetos de mi formulario aqui les muestro el codigo que estoy utilizando

for I:=0 to (sender as TPanel).ControlCount - 1 do
If (sender as TPanel).Controls[i].Name[1]='B' then
(sender as TPanel).Controls[i].free;

Pero no me elimina los objetos y me genera una Exception de EAccesViolation.

he intentado varias cosas pero nada, por eso prefiero preguntarle a los que saben .

Muchas Gracias!!
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
  #2  
Antiguo 14-11-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.290
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Utiliza TAG's en tus mensajes, se leen mejor (compara tu código con el mío):

Modifica el código y cambialo por éste:

Código Delphi [-]
  
  // comprueba que el sender es un TPanel, si no vas a tener problemas...
  if not (Sender is TPanel) then
    Exit;
  
  // relizamos la cuenta en orden inverso
  for I:= ((sender as TPanel).ControlCount - 1) downto 0 do
    If (sender as TPanel).Controls[i].Name[1]='B' then
                    (sender as TPanel).Controls[i].free;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 14-11-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
¿Por que liberas los controles de esta forma?
¿No confias en que se liberarán automaticamente cuando se libere el dueño?
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 14-11-2005
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
Cita:
Empezado por jachguate
¿Por que liberas los controles de esta forma?
¿No confias en que se liberarán automaticamente cuando se libere el dueño?
Lo que sucede es que no puedo liberar el dueño, porque el dueño es como decir el lienzo de un cuadro y en el hay otros objetos que no puedo liberar
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
  #5  
Antiguo 14-11-2005
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
Cita:
Empezado por Neftali
Utiliza TAG's en tus mensajes, se leen mejor (compara tu código con el mío):

Modifica el código y cambialo por éste:

Código Delphi [-]
   
   // comprueba que el sender es un TPanel, si no vas a tener problemas...
   if not (Sender is TPanel) then
     Exit;
   
   // relizamos la cuenta en orden inverso
   for I:= ((sender as TPanel).ControlCount - 1) downto 0 do
     If (sender as TPanel).Controls[i].Name[1]='B' then
                     (sender as TPanel).Controls[i].free;
Neftali muchas Gracias, pero me sigue dando la Exception. especificamente en esta linea de codigo
If (sender as TPanel).Controls[i].Name[1]='B' then
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
  #6  
Antiguo 14-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Los controles, ¿los creaste tú mismo en código? De ser así, ¿estás seguro de haberles asignado algo a la propiedad Name?

// Saludos
Responder Con Cita
  #7  
Antiguo 14-11-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.290
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por JerS
...pero me sigue dando la Exception. especificamente en esta linea de codigo:

Código Delphi [-]
        If (sender as TPanel).Controls[i].Name[1]='B' then
Entonces está claro que no es problema de la liberación, sino de ésta línea.
Deberías ejecutarlo paso a paso y ver en ésta línea que es lo que no está asignado.
Por ejemplo, se me ocurre que si el control no tienen nada en la propiedad Name (cadena vacía), al intentar acceder a la posición [1] va a dar error (Access Violation).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 14-11-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

Creo que si se muestra el codigo para crear los controles, se podria solucionar mas facil.!
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #9  
Antiguo 14-11-2005
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
Cita:
Empezado por Neftali
Entonces está claro que no es problema de la liberación, sino de ésta línea.
Deberías ejecutarlo paso a paso y ver en ésta línea que es lo que no está asignado.
Por ejemplo, se me ocurre que si el control no tienen nada en la propiedad Name (cadena vacía), al intentar acceder a la posición [1] va a dar error (Access Violation).
Eso es exactamente lo que esta pasando Neftali,
yo le coloco

If (sender as TPanel).Controls[i].Name[1]<>'' Then
If (sender as TPanel).Controls[i].Name[1]='B'

Pero Igual
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
  #10  
Antiguo 14-11-2005
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
Cita:
Empezado por roman
Los controles, ¿los creaste tú mismo en código? De ser así, ¿estás seguro de haberles asignado algo a la propiedad Name?

// Saludos
En cuanto a los controles, son puros objetos como Timage, TShape.
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
  #11  
Antiguo 14-11-2005
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
Listo Amigos muchas Gracias

for I:= ((sender as TPanel).ControlCount - 1) downto 0 do
If (sender as TPanel).Controls[i].Name<>'' then
If (sender as TPanel).Controls[i].Name[1]='B' then
(sender as TPanel).Controls[i].free;

mi error era que estaba preguntando

If (sender as TPanel).Controls[i].Name[1]<>'' then


y eso esta errado porque si esta '' es imposible que consiga algo en este indice [1];

Muchas Gracias
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
  #12  
Antiguo 14-11-2005
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Smile

Te recomiendo no abusar tanto del operador as. Si como te indicó el amigo Neftali compruebas que Sender es un TPanel por medio de:

Código Delphi [-]
if not (Sender is TPanel) then
Exit;

Entonces ya puedes usar directamente:

Código Delphi [-]
for I:= TPanel(sender).ControlCount - 1) downto 0 do
  If TPanel(sender).Controls[i].Name<>'' then
    If TPanel(sender).Controls[i].Name[1]='B' then
      TPanel(sender).Controls[i].free;

Con esto ganarás en velocidad y eficiencia.

Saludos
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo


Última edición por yusnerqui fecha: 14-11-2005 a las 19:37:45.
Responder Con Cita
  #13  
Antiguo 14-11-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Amigo JerS. Te llamo a usar las etiquetas [code], [delphi], [sql] o [php] para publicar trozos de código. Ya con tu "edad" en los foros, resulta inaceptable que no la uses aún.

Mas información, aqui.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
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


La franja horaria es GMT +2. Ahora son las 10:00:33.


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