..
if Form2 = nil then Application.CreateForm(TForm2, Form2);
Form2.Show;
..
Procedure Tform2.Formclose(Sender: TObject; Var CloseAction: TCloseAction);
Begin
CloseAction := caFree;
End;
The second time you call it, Form2 is not nil and it points at the destroyed form. It should give you a nice SIGSEGV
You need to set Form2 tol nil when you destroy it.