So far, in my application it has worked out that all additional forms that were created at runtime, should be modal. Thus, when creating a new form I use something similiar the following block of code:
void __fastcall ShowForm( TComponent * Owner )
{
TForm1 * form = new TForm1( Owner );
form->ShowModal();
delete form;
}
With this approach, the form's memory is easily deleted after the user has closed it.
However, I am running into an issue when trying to figure out how to handle memory management for a non modal dialog. Obviously, I can't simply call delete at the end of the ShowForm
method as the form would be deleted right after it was created. So I am left with something like this:
void __fastcall ShowForm( TComponent * Owner )
{
TForm1 * form = new TForm1( Owner );
form->Show();
}
Based on this documentation and a test application I have written, I know that the form
pointer will be deleted once its owner has been closed. However, that still leaves me with the following scenario:
Lets say I have FormA
with a button that creates and shows an instance of FormB
using code just like the method above. I now click the button to create a FormB
and then close FormB
, three times. Until FormA
is closed, the three instances of FormB
remain in memory.
How do I manage memory for form creation such that the memory allocated for a form is deleted once that form is closed? Is there a standard best practice for this, or a built in feature I am missing?
Use the TForm::FormClose event, and set the Action
parameter to caFree
:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = TCloseAction::caFree;
}
The Form will then free itself when it is closed.