Po pierwsze chcesz okno zamknąć, czy je zniszczyć? Kliknięcie na przycisku X na pasku tytułowym nie niszczy okna, lecz je zamyka. Okno niszczy się funkcją delete. Pokazałem ci to w ostatnim poście:
int nr_form = 2;
std::vector<TForm2 *>::iterator itForm = FormList.begin() + nr_form;
if(itForm > FormList.end() - 1)
{
ShowMessage("Taki formularz nie istnieje");
return;
}
delete FormList[ nr_form ]; // niszczysz obiekt
FormList.erase( itForm );
Dlatego podałem również kod na zamknięcie i ponowne przywołanie okna:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int nr_form = 2; /* podajesz numer okna na liście, do którego chcesz się odwołać
lista odlicza od 0, więc 2 oznacza trzeci formularz */
std::vector<TForm2 *>::iterator itForm = FormList.begin() + nr_form;
if(itForm > FormList.end() - 1)
{
ShowMessage("Taki formularz nie istnieje");
return;
}
FormList[ nr_form ]->Close(); // tylko zamykasz, nie nieszczysz
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
int nr_form = 2;
std::vector<TForm2 *>::iterator itForm = FormList.begin() + nr_form;
if(itForm > FormList.end() - 1)
{
ShowMessage("Taki formularz nie istnieje");
return;
}
FormList[ nr_form ]->Show();
}
//---------------------------------------------------------------------------
Jeżeli w zdarzeniu OnClose formularza TForm2 umieścisz:
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}
To przy zamknięciu okna będzie ono niszczone, to oznacza, że ten kod:
delete FormList[ nr_form ]; // niszczysz obiekt
nie może być użyty, gdyż okno zostało już zniszczone, trzeba jednak usunąć okno z listy FormList, czyli:
FormList.erase( itForm );
Pozostaje więc kwestia wykrycia, które okno zostało zniszczone oraz kiedy to sprawdzać i na to chwilowo nie mam pomysłu, muszę to przemyśleć.