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
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 ControlMouseDown(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 Movimentaçã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
Begin
Left := X-moveX+Left;
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.
*********************************************************************
"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.
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 ControlMouseDown(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 Movimentaçã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 DoBegin
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):
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):
*********************************************************************
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:
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.
Dica realmente útil, vai para o favoritos.
Show ;)
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-))
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.
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
Parabéns pela dica! Funcionou sem problemas no Linux utilizando lazarus 1.4.4 x86_64/gtk2
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