Typically all the forms you create in the IDE are automatically created when your application starts. (You can choose which forms are auto-created from the Project->Options menu.) You can see the code that does it by choosing Project->View Source (to see the WinMain() function).
What appears to be happening is that you are
Free()ing the form when it is closed, and you can no longer
Show() an object that has been destroyed.
From what I understand that you want to do, you should go to the project options and remove the Form2 from the auto-create list. (You can also delete the Form2 variable from the unit source file.)
Next, in your button click handler, (1) create a new instance of the form and (2) show it.
System::Void Form1::button5_Click(System::Object^ sender, System::EventArgs^ e)
{
TForm2 newForm;
Application->CreateForm( TForm2, newForm ); // (1)
newForm.Show(); // (2)
}
Now you can click the button to get as many copies of TForm2 as you want, and closing each one should still delete the individual instance.
Hope this helps.