El código que te expuse son un ejemplo de como se usa en OnCloseQuery.
Lo que tu necesitas hacer es una combinación del onCloseQuery y OnClose.
Si lo que deseas es que el formulario se cierre independientemente si debe o no guardar los cambios deberás hacerlo empleando una variable pública o global que te permita decidir si debe guardar o no. CanClose Deberá ser True.
De modo que que debes hacer algo por el estilo:
Código Delphi
[-]procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var Rta: integer;
begin
Rta := MessageBox(0, '¿Quiere usted guardar antes de salir?', 'Advertencia', MB_ICONQUESTION or MB_YESNO);
if Rta = IDYES
then DebeGuardar := True
else DebeGuardar := False;
CanClose := True; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if DebeGuardar
then GuardarCambios;
Action := caFree; end;
procedure TForm1.GuardarCambios;
begin
end;
Espero haber sido más claro.
Saludos,