Когда основная форма закрыта, приложение закрывается, что освобождает основную форму, что, в свою очередь, освобождает принадлежащие ей формы. Собственные формы не закрываются, они просто освобождаются, поэтому их событие OnClose
обычно вообще не запускается.
Если вы видите, что ShowMessage
вызывается из события OnClose
собственной формы, но диалоговое окно не отображается, это, вероятно, потому, что приложение уже завершено и больше не обрабатывает сообщения. Это означает, что событие OnClose
в пользовательской форме инициируется где-то в вашем собственном коде, но слишком поздно.
Один из способов воспроизвести это поведение - отправить сообщение WM_CLOSE
в собственную форму из события OnClose
основной формы. Затем сообщение обрабатывается собственной формой в более поздний момент, когда приложение уже завершено, любая попытка вызвать ShowMessage или любую модальную форму больше не имеет никакого эффекта.
Я согласен с Майклом, что OnCloseQuery
лучше подходит для отображения подсказки для пользователя. К сожалению, это само по себе не помогает, поскольку собственные формы освобождаются, а не закрываются. Вы должны вызвать их OnCloseQuery
событие вручную, например:
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
I: Integer;
begin
CanClose := False;
for I := 0 to ComponentCount - 1 do
if Components[I] is TCustomForm then
if not TCustomForm(Components[I]).CloseQuery then
Exit;
CanClose := True; // or another check if the main form can be closed, too
end;