Desactivar la forma de cambiar el tamaño en Delphi
forms resize (3)
¿Hay alguna manera de evitar que el usuario cambie el tamaño del formulario?
Actualmente estoy usando:
Cuando el tamaño de la forma cambió ...
MainForm.Height := 761;
MainForm.Width := 777;
Pero esto parece horrible, ya que parpadea cuando el usuario intenta cambiar el tamaño del formulario.
Puede agregar código en Eventos "OnCanResize":
Resize := False;
Ejemplo:
procedure TF_NameForm.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
Resize := False;
end;
Si desea que su formulario no cambie de tamaño, entonces establecer el estilo del borde del formulario en bsSingle
es lo correcto, ya que el cursor del mouse no cambiará a uno de los cursores de tamaño cuando se mueva sobre los bordes del formulario. Es obvio para el usuario que este formulario no puede redimensionarse.
Si desea establecer un tamaño mínimo y / o máximo para el formulario, entonces bsSizeable
es el estilo de borde correcto, y puede usar las Constraints
del formulario para especificar los límites. Sin embargo, existe el problema de que la propiedad Constraints
no impide el cambio de tamaño del formulario, solo hace que los tamaños se ajusten después del hecho para que no se violen los límites. Esto tendrá el efecto secundario negativo de que el tamaño de la forma con el borde izquierdo o superior lo moverá. Para evitar que esto suceda, es necesario evitar el cambio de tamaño en primer lugar. Windows envía el mensaje WM_GETMINMAXINFO
para recuperar los tamaños de seguimiento mínimo y máximo para una ventana de nivel superior. Manejar esto y devolver las restricciones correctas soluciona el problema de la forma en movimiento:
type
TForm1 = class(TForm)
private
procedure WMGetMinMaxInfo(var AMsg: TWMGetMinMaxInfo);
message WM_GETMINMAXINFO;
end;
// ...
procedure TForm1.WMGetMinMaxInfo(var AMsg: TWMGetMinMaxInfo);
begin
inherited;
with AMsg.MinMaxInfo^ do begin
ptMinTrackSize := Point(Constraints.MinWidth, Constraints.MinHeight);
ptMaxTrackSize := Point(Constraints.MaxWidth, Constraints.MaxHeight);
end;
end;
Reparar el tamaño es fácil, tienes dos opciones:
Los formularios de Delphi tienen una propiedad
BorderStyle
y una propiedadBorderIcons
. Si configuraBorderStyle
enbsDialog
, yBorderIcons
enbiSystemMenu
solamente, el usuario no puede cambiar el tamaño del formulario.Puede especificar valor a la propiedad
Constraints
. Si escribe el mismo número enMinWidth
yMaxWidth
, el ancho será fijo.
Prevenir el movimiento es más complicado. Solo puedo encontrar estas soluciones ahora:
Establezca
BorderStyle
enbsNone
. Necesitará dibujar el título del formulario usted mismo, si es necesario.Escriba un manejador de mensajes a
WM_NCHITTEST
, llame primero al heredado, luego verifique elMessage.Result
paraHTCAPTION
. Si esHTCAPTION
,HTCLIENT
enHTCLIENT
enHTCLIENT
lugar. De esta manera, engañar a Windows para pensar que el usuario no hizo clic en el título, por lo que no podrá arrastrar. Por favor, intente si el usuario todavía puede mover la ventana abriendo el menú del sistema y seleccionando Mover. Si es así, también tiene que ocultar el menú del sistema (BorderIcons
).
Respuesta encontrada here .