Blog literacki, portal erotyczny - seks i humor nie z tej ziemi
TForm i TApplication
27.08.1999
Jak zmusić formę MDI child do zamknięcia.
Kiedy zamykasz okno MDI child, zauważysz, że ulega ono minimalizacji, a nie zamknięciu. Wszystko wyjaśnia się po spojrzeniu na metodę TCustomForm::Close.
void __fastcall TCustomForm::Close()
{
...
if(FormStyle == fsMDIChild)
{
if BorderIcons.Contains(biMinimize))
CloseAction = caMinimize
else
CloseAction = caNone
}
...
if (FOnClose)
FOnClose(this, CloseAction);
...
}
CloseAction jest zmienną typu wyliczeniowego, która mówi TForm w jaki sposób forma jest zamykana. Zamykanie może oznaczać kilka różnych rzeczy. Możesz na przykład schować formę, ale bez zniszczenia obiektu. Możesz też zniszczyć formę całkowicie - okno i obiekt. Wreszcie możesz nic nie robić... Możliwe wartości CloseAction znajdziesz w pliku FORMS.HPP.
enum TCloseAction { caNone, caHide, caFree, caMinimize };
Dla form nie będących MDI child, CloseAction jest inicjalizowane jako caHide. Zauważ, że TCustomForm::Close ustawia CloseAction na caMinimize jeżeli forma MDI child ma przycisk minimalizujący. Formy MDI child nie mogą być ukrywane. VCL minimalizuje okno, żeby obejść to ograniczenie.
Jeśli chcesz, aby forma MDI child zamykała się, a nie minimalizowała, musisz napisać handler OnClose, który ustawi CloseAction na caFree. VCL przekazuje zmienną CloseAction do Twojego handlera, tak żeby ostatnie słowo należało do Ciebie. Poniższy kod demonstruje jak to wykonać:
void __fastcall TMDIChild::FormClose(TObject *Sender,
TCloseAction &Action)
{
Action = caFree;
}
Uwaga: Ustawienie CloseAction na caFree zmusza VCL do zniszczenia okna MDI child. Nie próbuj poddawać wskaźnika formy MDI child dereferencji, albo kasować go, ponieważ zostało to już zrobione.