Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda con ControlCount (https://www.clubdelphi.com/foros/showthread.php?t=27176)

JerS 14-11-2005 16:42:32

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!!

Neftali [Germán.Estévez] 14-11-2005 17:13:09

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;

jachguate 14-11-2005 17:21:42

¿Por que liberas los controles de esta forma?
¿No confias en que se liberarán automaticamente cuando se libere el dueño? :confused:

JerS 14-11-2005 17:30:31

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? :confused:

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

JerS 14-11-2005 18:03:20

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

roman 14-11-2005 18:17:27

Los controles, ¿los creaste tú mismo en código? De ser así, ¿estás seguro de haberles asignado algo a la propiedad Name?

// Saludos

Neftali [Germán.Estévez] 14-11-2005 18:19:45

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).

vtdeleon 14-11-2005 18:32:55

Saludos

Creo que si se muestra el codigo para crear los controles, se podria solucionar mas facil.!

JerS 14-11-2005 18:41:58

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

JerS 14-11-2005 18:43:32

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.

JerS 14-11-2005 18:46:56

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 :D

yusnerqui 14-11-2005 19:33:51

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

jachguate 14-11-2005 21:52:31

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.

;)


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

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