Cambia tu bucle por este otro:
Código Delphi
[-]
for i := slElementos.Count - 1 downto 0
if Assigned( slElementos.Objects[i] ) then
begin
slElementos.Objects[i]).Free;
end;
slElementos.Clear;
El bucle que haces era en orden ascendente, pero cuando eliminas uno, el Count cambia, por lo que siempre que eliminas uno, te saltas otro....ejemplito:
tienes en el stringlist:
Código:
cero
uno
dos
tres
empezamos el bucle y borras el elemento cero, la lista pasa a ser:
ahora pasa a borrar el índice uno....que borraría el elemento "dos":
Ahora pasaríamos a borrar el índice 3, pero como no existe (la propiedad count se ha actualizado al nuevo valor, pues sale del bucle.
Peor aún, no se termina de eliminar los elementos del stringlist, no ya los objetos en sí mismo, sino las cadenas de texto que tengas.
Como norma general: al destruir elementos de cualquier tipo de array o lista,
hazlo siempre en orden descendente.
Con mi modificación no haría falta utilizar un bucle descendente, ya que no elimino el "string", pero para recordar este tipo de fallos, siempre lo hago.
¿Por qué no hago el "Delete(i)"? Por que es más eficiente borrarlos todos de un golpe con Clear, que ir borrándolos uno a uno. Si no necesitas borrarlos todos, pone el delete(i) dentro del bucle, ahora no fallará.
Como ves Delphi aquí no tiene nada que ver, primero tenemos que reconocer que somos novatos, para aceptar este tipo de fallos y aprender de ellos, es la única forma de llegar a ser algún día... por ejemplo cómo
cHackAll
Como ya dije, no estoy de acuerdo con crear 1300 botones, pero si ha de hacerse...se hace. Hacerlo "pa ná" es tontería
Saludos.