|
Determinando si un formulario ha sido movido
Copyright © 2000 Ernesto
De Spirito
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.
|