Varios puntos:
1. Por que preguntar si un objeto es tal clase utilizando strings? No es mejor hacer algo asi
Código Delphi
[-]
EsTFrame1 := UnFrame is TFrame1;
2. No recorras los componentes del form, recorre los controles ya que los frames los creaste en tiempo de ejecucion
3. La sentencia de destruccion:
a. No hace falta que castees a TFrame1 para llamar al metodo destroy
b. No uses destroy explicitamente, usa Free siempre que es mas seguro
c. No estas eliminando la referencia de la lista en cuestion. Lo mas correcto seria
d. Ahora que recuerdo, al eliminar de la lista hay que recorrerla en sentido inverso
Código Delphi
[-]
for I := form1.ControlCount - 1 downto 0 do
begin
if form1.Controls[i] is TFrame1 then
begin
form1.Controls[i].Free;
form1.Controls.Delete(i); end;
end;
Con respecto a que el layout no es el esperado no puedo ayudarte mucho mas
. Una pena que lazarus no tenga un componente tipo TGridPanel