Establecer la propiedad CanClose a Falso presenta un par de problemas. Este artículo muestra cómo superarlos.

Impidiendo que el usuario cierre un formulario

Copyright © 2000 Ernesto De Spirito

EurekaLog - Capture y registre cada excepción!

Pare evitar que el usuario pueda cerrar un formulario debemos inhabilitar el botón Cerrar del formulario e inhabilitar también el menú "Cerrar" del menú del sistema del formulario. Esto se logra llamando a la función API EnableMenuItem (ver el ejemplo abajo). No obstante, el usuario todavía puede cerrar el formulario presionando Alt+F4, así que debemos asignar True a la propiedad KeyPreview del formulario y escribir un manejador de evento para el evento OnKeyDown y poder así anular esa combinación de teclado:

uses Windows;

procedure TForm1.FormCreate(Sender: TObject);
var
  hSysMenu: HMENU;
begin
  hSysMenu := GetSystemMenu(Self.Handle, False);
  if hSysMenu <> 0 then begin
    EnableMenuItem(hSysMenu, SC_CLOSE,
      MF_BYCOMMAND Or MF_GRAYED);
    DrawMenuBar(Self.Handle);
  end;
  KeyPreview := True;
end;

procedure TForm1.FormKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_F4) and (ssAlt in Shift) then
    Key := 0;
end;
JfControls Library - para Delphi y C++ Builder