PDA

Ver la Versión Completa : Ayuda con ControlCount


JerS
14-11-2005, 16:42:32
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 (http://www.clubdelphi.com/foros/showthread.php?t=9992), se leen mejor (compara tu código con el mío):

Modifica el código y cambialo por éste:



// 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
¿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
Utiliza TAG's en tus mensajes (http://www.clubdelphi.com/foros/showthread.php?t=9992), se leen mejor (compara tu código con el mío):

Modifica el código y cambialo por éste:



// 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
...pero me sigue dando la Exception. especificamente en esta linea de codigo:


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


if not (Sender is TPanel) then
Exit;


Entonces ya puedes usar directamente:


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.

;)