Hola Celta.
Estuve mirando tu código y lo identé para mayor legibilidad, aunque veo que
Casimiro ya lo ha echo... ( gracias.
)
Al liberar los objetos TImagen, tenés usar el ciclo en forma descendente, ya que cuando un objeto es
liberado la posición es ocupada por el sucesor y cuando la variable de control llegue al valor Count - 1
seguro que hay menos objetos que ese valor.
Te puse el código con algunas correcciones, el cual probé con otras imágenes en una prueba sencilla.
No verifiqué la validez de las evaluaciones del condicional if, pero si son correctas, este código no debería darte error:
Código Delphi
[-]
for i := ListaEne.Count -1 downto 0 do
begin
Ene := ListaEne.Items[i];
a1 := (imgmisil.Left + imgmisil.Width);
a2 := (ene.Left + ene.Width);
c1 := (imgmisil.Top + imgmisil.Height);
c2 := (ene.Top + ene.Height);
if (((imgmisil.Left < ene.Left) and (a1 > ene.Left)) and
((imgmisil.Top < ene.Top) and (c1 > ene.Top))) or
((ene.Left < imgmisil.Left) and (a2 > imgmisil.Left)) and
((ene.Top < imgmisil.Top) and (c2 > imgmisil.Top))) or
(((imgmisil.Left < ene.Left) and (a1 > ene.Left)) and
((ene.Top < imgmisil.Top) and (c2 > imgmisil.Top))) or
(((ene.Left < imgmisil.Left) and (a2 > imgmisil.Left)) and
((imgmisil.Top < ene.Top) and (c1 > ene.Top))) then
begin
TImage(ListaEne.Items[i]).Free;
ListaEne.Delete(i);
end;
end;
Ya que simplificando el ejemplo, sería:
Código Delphi
[-]
for i:= ListaEne.Count-1 downto 0 do
begin
Ene:= ListaEne.Items[i];
if Ene.Name = 'Imagen1' then
begin
TImage(ListaEne.Items[i]).Free;
ListaEne.Delete(i);
end;
end;
Un saludo.