Problemas no hay ninguno mientras no solapes las 2 creaciones del objeto.
Esto es inaceptable:
Código Delphi
[-]procedure TFrameCamAlt.BtnSalirClick(Sender: TObject);
begin
FrameCamAlt.Free;
end;
Porque desde una clase TFRameCamAlt, estas intentando liberar la memoria del objeto que lo instancia.
Imagina un código así:
Código Delphi
[-]
var x:TFrameCamAlt;
begin
x := TFrameCamalt.Create(nil);
end;
Cuando el usuario pulse el botón salir, se querrá liberar la variable FrameCamAlt que sabe dios si está creada o no.
La solución a tu problema, desde mi punto de vista, es crear al frame un evento OnSalir, cuando el usuario pulsa el botón salir, se lanza ese evento, que lo recoge la ventana donde se creó el Frame, y desde allí se destruye el Frame. Resultará complejo, pero deberías hacerlo así:
Definición del Frame:
Código Delphi
[-]
TFrameCamAlt = class(Tframe)
...
private
FOnSalir : TnotifyEvent;
public
property OnSalir:TnotifyEvent read FOnSalir write FOnSalir;
end;
implementation
procedure TFrameCamAlt.BtnSalirclick(....);
begin
if Assigned(FOnSalir) then FOnSalir(Self);
end;
Ahora la ventana donde quieres incluir el frame en ejecución:
Código Delphi
[-]
TForm1 = class (TForm);
...
private
CamAlt : TFRameCamAlt;
procedure RecibeEventoSalir(Sender:TObject);
....
implementation
procedure Tform1.FormCreate(...); supongo que creas el frame al crear el Form
begin
CamAlt := TFRameCamAlt.Create(nil);
CamAlt.OnSalir := RecibeEventoSalir;
end;
procedure TForm1.RecibeEventoSalir(Sender:TObject);
begin
FreeAndNil(CamAlt);
end;
Aquí está el detalle importante: La misma ventana que crea el frame es el que lo destruye. Además evitas dolores de cabeza, muy típico cuando depuras un programa: "El frame se crea en el form1... pero ¿donde se destruye? ahhh ... siii, en el Form25 cuando se pulsa el boton XXX"... demasiado lío compañero.
Saludos