Necesito modificar la barra de título de un form

Necesito modificar la barra de titulo de un formulario, para que quede sin el botón Cerrar.
Hasta ahora sólo puedo deshabilitarlo con este código:
RemoveMenu(GetSystemMenu(Handle, False), SC_CLOSE, MF_BYCOMMAND);
Se que se hace con la función SetWindowLong, pero no se como usarla.
Desde ya, agradezco sus respuestas.

2 Respuestas

Respuesta
1
OK, Prmero la funcion SetWindowLong yo la he ocupado para ocultar mi aplicacion del administrador de tareas, aunque para Win 32 y 64 la funcion ha cambiado a SetWindowLongPtr.
Puedes chacar esta documentacion si te interesa:
SetWindowLong
SetWindowLongPtr
Para quitar el botón Cerrar de un formulario yo normalmente utilizo:
Form1. BorderIcons. BiSystemMenu:=False //Esto quita por completo el menu de sistema (Boton maximizar, minimizar, cerrar).

Si solo quieres que no se pueda ocupar el botón Cerrar (X) puedes usar este código:
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;

 
Adicionalmente para que no funcion tampoco el Alt+F4 puedes poner:
procedure TForm1.FormKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_F4) and (ssAlt in Shift) then
    Key := 0;
end;

Respuesta
1
El comando que comentas lo que hace es quitar la opción "Cerrar" del menú del sistema (el que aparece al hacer clic sobre el icono de la ventana, esquina superior-izquierda) y ademas deshabilita el botón "Cerrar" (no lo oculta). Debería funcionar sin problemas, siempre y cuando ejecutes el comando DESPUÉS de haberse creado la ventana (por ejemplo, en el evento "OnShow").
También puedes ocultar el botón "Cerrar" en tiempo de diseño, desactivando la propiedad del formulario "BorderIcons -> bySystemMenu" (esto oculta el icono de sistema y el botón "Cerrar".)
O también podrías evitar que el formulario se cerrara, añadiendo este código al evento "OnClose":
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Cerrar <> True then Abort;
end;
Nota: La variable "Cerrar" debes crearla y puedes ponerla a "True" para utilizarla cuando "seas tu" quien quiere cerrar el formulario mediante código.
Si tienes alguna duda, coméntalo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas