Это да. Деструкторы есть и они отрабатывают. Но надо OnClose. Именно в этой процедуре происходит проверка на модификацию и там же запрос на сохранение изменений.
Можно перехватить системное событие в главной форме (вроде бы, как раз тот момент, когда не главные формы еще существуют):
Код:
procedure TfrmMain.WMGetSysCommand(var message: TWMSysCommand{TMessage});
begin
if (message.wParam = SC_CLOSE) then begin
if <условие> then
//но как здесь запретить вываливаться из проги?
end else
inherited;
end;