Movimentando Objetos Livremente
Autor: delphizinho | Publicado: 2009-03-03T09:48:00-03:00

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 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 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.