No se quien es "self" ya que no pusiste que clase ejecuta el codigo
Probablemente sea un form; osea que el panel va a ser liberado:
1. Cuando hagas panel.Free
2. Cuando se libere el form
Otra opcion seria no liberar los paneles, sino que reusarlos; actualizar o modificar la info y solo descartar todo cuando se cierra la aplicacion.
Otro gran problema es FindComponent. No tengo delphi a mano para probar, pero estoy seguro que FindComponent no encuentra lo que fue creado en runtime; solo lo de tiempo de diseño
Por ejemplo,
Código Delphi
[-]
AlgunForm.Components[] --> array de componentes, en tiempo de diseño
AlgunForm.Controls[] --> array de controles, incluye los componentes y tambien lo creado en tiempo de ejecucion
Debido a esto apuesto a que FindComponent se comporta de manera similar
Lo puedes depurar facilmente,
Código Delphi
[-]
for I := panel_total downto 1 do
begin
PanelDinamico := findcomponent('paneldinamico'+inttostr(i)) as Tpanel;
if assigned (PanelDinamico) then
PanelDinamico.free; -> punto de ruptura aca, o un showmessage ,para ver si entra al if, yo estoy seguro que no
end;
Como te decia, deberia ejecutar la aplicacion con ReportMemoryLeaksOnShutdow := True, asignalo en el OnCreate del form principal o en el inicio de la aplicacion (.dpr); esto te va a decir que objetos no estan siendo liberados, aunque tomarlo con pinzas: el que sean liberados no te garantiza que sean liberados cuanto tu quieres que sean liberados; me explico, como estas creando los paneles con un Owner (Self, el form) quiere decir que cuando muere el form, mueren los paneles, pero lo interesante en tu caso es que se liberen antes
La forma mas comoda para liberar los paneles en tu caso es, creas una simple lista y metes todos los paneles ahi, y luego simplemente la recorres y vas liberando