¿Cómo saber si el usuario ha movido una forma?

Determinando si un formulario ha sido movido

Copyright © 2000 Ernesto De Spirito

Boletín Pascal. Newsletter gratuito para programadores Delphi (y Kylix) con artículos, noticias, trucos, componentes y enlaces a nuevo contenido Delphi en la red.

Podemos saber si un formulario ha sido cambiado de tamaño con el evento Resize (propiedad OnResize), pero ¿cómo sabemos si un formulario ha sido movido? Simplemente capturando el mensaje WM_MOVE de Windows:

interface

...

type
  TForm1 = class(TForm)
    ...
  private
    { Private declarations  }
    procedure FormMove(var Msg: TWMMove); message WM_MOVE;
    ...
  end;

...

implementation

...

procedure TForm1.FormMove(var Msg: TWMMove);
begin
  inherited;
  Label1.Caption := Format('(%d,%d)', [Left, Top]);
end;

...

Llamamos a "inherited" para permitir a los ancestros de TForm procesar el mensaje. Esto actualizará las propiedades Left y Top. En el ejemplo de arriba simplemente las mostramos, pero podemos utilizar esta especie de evento por ejemplo para garantizar que el formulario esté siempre ubicado dentro de los límites del área de trabajo de la pantalla (la porción de la pantalla no usada por la barra de tareas del sistema o por barras de herramientas de escritorio de aplicaciones).

procedure TForm1.FormMove(var Msg: TWMMove);
var
  WorkArea: TRect;
begin
  inherited;
  if SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0) then begin
    if Left < WorkArea.Left then
      Left := WorkArea.Left
    else if Left + Width > WorkArea.Right then
      Left := WorkArea.Right - Width;
    if Top < WorkArea.Top then
      Top := WorkArea.Top
    else if Top + Height > WorkArea.Bottom then
      Top := WorkArea.Bottom - Height;
  end;
end;

Puede encontrar el código fuente completo de este artículo en el archivo que acompaña al Boletín Pascal #20.

JfControls Library - para Delphi y C++ Builder