Cómo arrastrar un form captionless en Free Pascal-Lazarus-Typhon

Drag Captionless

Vamos a crear una demostración sobre cómo hacer un form sin barra de leyenda que se pueda arrastrar desde cualquier lugar desde el form. Algunas ideas fueron tomadas de este sitio http://delphi.about.com/library/weekly/aa102505a.htm y  http://lazplanet.blogspot.com.uy/2013/06/dragging-form-by-its-body .html

Cree un nuevo proyecto en su propio nuevo directorio y llámelo unidad ‘dragcaptionless’.

Agregue un TButton a la parte inferior derecha del formulario recién creado. Cambie la propiedad Caption a ‘Bye!’.

Form1

En el Manejador de Eventos OnClick escriba el siguiente código:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Application.Terminate;
end;

Agregue las siguientes variables a la parte privada del formulario TForm1. Esto salvará la posición del formulario mientras se mueve.

private
  { private declarations }
  //Variables to keep form position
  inReposition : boolean;
  oldPos : TPoint; 
public

En la cláusula uses agregue la biblioteca LCLIntf de la forma siguiente:

uses
 Classes, ...   ...,
 // Compatibility library gives SetCapture and ReleaseCapture
 LCLIntf;

Ahora selecciones el Formulario Form1 en la ventana de diseño.

En el Manejador de Eventos de Form1.OnCreate agregue el siguiente código:

procedure TForm1.FormCreate(Sender: TObject);
begin
 self.BorderIcons:=[];
 self.BorderStyle:=bsNone;
end;

Esto desactiva el borde y el título de nuestro formulario.

En el Manejador de Eventos de Form1.OnMouseDown, agregue el siguiente código:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 if (Sender is TForm) then
 begin
   //Get the MouseDown cursor position and keep it
   oldPos.X:=X;
   oldPos.Y:=Y;
   //we are now repositioning the form
   inReposition:=True;
 end;
end;

Este código establece el comienzo del procedimiento de mover el formulario.

En el Manejador de Eventos de Form1.OnMouseMove, agregue el siguiente código:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 newPos: TPoint;
begin
 // Get actual position from mouse for this event
 newPos.X:=X;
 newPos.Y:=Y;
 //if we are moving
 if inReposition then
 begin
 with TForm(Sender) do
 begin
 //Change cursor to grab mode
 Screen.Cursor := crSize;
 //Adjust new form position relative to first position
 SetBounds(Left + (newPos.X - oldPos.X), Top + (newPos.Y - oldPos.Y), Width, Height);
 end;
 end;
end;

Esto cambiará la posición del formulario mientras se mueve.

En el Manejador de Eventos de Form1.OnMouseUp, agregue el siguiente código:

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 if inReposition then
 begin
 //Restore normal cursor
 Screen.Cursor := crDefault;
 //We are not moving anymore
 inReposition := False;
 end;
end;

Esto restaura el cursor y deja de mover el formulario.

Ahora estamos listos para compilar y ejecutar.

Run | Build

y (si no dio errores)

Run | Run

¡Y arrástrelo!

A disfrutar!

Entradas relacionadas