Movimentando Objetos Livremente

Hoje, vamos aprender como movimentar (arrastar) qualquer objeto na tela do formulário, utilizando apenas o mouse. Para o objeto ser arrastado em qualquer direção, são necessários alguns ajustes.

Neste exemplo, vamos utilizar uma Label
(TLabel da Paleta Standart) e um Botão (TBitBtn da Paleta Additional).
Nome do formulário será: FMovObj.

>> Vamos precisar de três procedimentos: ControlMouseDown, ControlMouseUp, ControlMouseMove;
>> De uma classe TMoveControle do tipo TControl;
Observação: A classe TMoveControle será declarado em Type.
>> E de três variáveis: moveX, moveY do tipo Inteiro (integer) e mover do tipo (boolean). Essas variáveis são globais.

Definições:
>> Type -> com esta clausula podemos declarar Novos Tipos e/ou Classes.
>> Variáveis Globais -> declaradas da Interface da Unit. Podem ser acessadas por qualquer Unit usuária.

Como o entendimento desse código é um pouco mais complicado, colocarei aqui toda a Unit.

unit uMovObj;

interfaceuses
Classes, Controls, StdCtrls, Forms, Buttons;

type
TFMovObj = class(TForm)

Label1: TLabel;
BitBtn1: TBitBtn;

Label2: TLabel;

{Procedimentos para o objeto se mover}
procedure ControlMouseMove(Sender: TObject; Shift
: TShiftState; X, Y: Integer);
procedure ControlMouseD
own(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

private
{ Private declarations }
public

{ Public declarations }
end;


var
FMovObj: TFMovObj;

{variáveis necessárias}
moveX, moveY: Integer;

mover: boolean;


implementation
{$R *.dfm}

{-----------------------------------------------------
{ Iniciando codificação de Movimen
tação de Objetos.
{-----------------------------
------------------------}
{Mover Componentes RunTime}

type
TMoveControle = class(TControl);


procedure TFMovObj.ControlMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

moveX := X;
moveY := Y;
mover := True;

TMoveControle(Sender).MouseCapture := True;
end;

procedure TFMovObj.ControlMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);

begin
if mover then begin
with Sender As TControl Do
Begin
Left := X-moveX+Left;

Top := Y-moveY+Top;
End;
end;
end;


procedure TFMovObj.ControlMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

if mover then begin
mover := False;

TMoveControle(Sender).
MouseCapture := False;
end;

end;

{-----------------------------------------------------
{ Finalizando codificação de Movimentação de Objetos.
{-----------------------------------------------------}

Para que cada objeto que colocamos na tela (Label, Botão) funcione, é preciso linka-los com os procedimentos codificados.

-----------------------
Linkando a Label -> Selecione a Label, e em Eventos faça:

-> No Evento OnMouseDown, selecione a procedure ControlMouseDown.

-> No Evento OnMouseMove, selecione a procedure ControlMouveMove.

-> No Evento OnMouseUp, selecione a procedure ControlMouseUp.

-----------------------
Linkando o Botão -> Selecione o Botão, e em Eventos faça:

-> No Evento OnMouseDown, selecione a procedure ControlMouseDown.

-> No Evento OnMouseMove, selecione a procedure ControlMouveMove.

-> No Evento OnMouseUp, selecione a procedure ControlMouseUp.

Dica Importante: Ao selecionar a procedure no Evento do objeto, dê um duplo-clique na procedure selecionada até que seja exibido o código da procedure na janela da Unit, para que o Delphi reconheça o código a ser linkado.

Exemplo, ao selecionar no Evento OnMouseDown -> a procedure ControlMouseDown, dando um duplo-clique, aparece o código, na janela da Unit:

(selecionando na Janela de Eventos):

(visualizando código):

*********************************************************************
Faça o download do arquivo: Movimentando Objetos.rar
*********************************************************************

"Só fazemos melhor aquilo que repetidamente insistimos em melhorar.
A busca da excelência não deve ser um objetivo e sim um hábito." Aristóteles.

8 comentários:

Cleverson disse...
5 de novembro de 2009 às 20:49

Muito tesaum esse código, usei ele juntamente com o código "criando edits em tempo de execução", e caiu como uma luva pro meu projeto.

Continue assim com essas dicas práticas e rápidas.
Muito obrigo e meus parabéns.

Anônimo disse...
22 de novembro de 2010 às 11:09

Dica realmente útil, vai para o favoritos.

Anônimo disse...
17 de março de 2011 às 11:21

Show ;)

Anônimo disse...
25 de março de 2012 às 03:26

Você arrebentou no Tutorial! Muito bem explicado e com o exemplo para baixar e tirar qualquer dúvida que não tenha sido sanada. Parabéns e post mais exemplos 8-))

Anônimo disse...
31 de janeiro de 2013 às 16:22

Parabéns pela dica, me ajudou bastante...

Eu estou com dificuldade em restringir o movimento do objeto dentro do form, não quero que ele vaze para fora do mesmo. Alguém pode me dar uma dica de como fazer? Desde já agradeço.

Welson disse...
19 de novembro de 2015 às 01:17

Parabéns pelo Post... Funciona perfeitamente .. agora só usar a criatividade ... gravar as posições no banco de dados e deixar a tela dinâmica para o cliente. VLW

rlmadiuto disse...
16 de setembro de 2016 às 22:10

Parabéns pela dica! Funcionou sem problemas no Linux utilizando lazarus 1.4.4 x86_64/gtk2

Unknown disse...
30 de setembro de 2017 às 18:56

oi, tentei rodar essa rotina e a linha que contem MouseCapture não foi reconhecida, uso o delphi rad studio 10.2.1, poderia dá uma dica? já tenho no uses FMX.forms e a ideia é usar no mobile.
rocha_roberto@hotmail.com

Postar um comentário