Olá amigos, depois de procurar por algum tempo, consegui a seguinte dica para mover qualquer componente em run-time. Da forma abaixo, criamos três eventos que de forma dinâmica e recursiva, para ser utilizado para diversos componentes.
Coloque alguns componentes a exemplo da imagem abaixo:

Serão criados três procedimentos que serão utilizados por todos
os objetos acima, são eles:
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);
Agora no Object Inspector, guia Events, relacione os métodos
OnMouseMuve, OnMouseDown e OnMouseUp, com os respectivos eventos acima.
Segue código da Unit:
unit movecomponenteruntime;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, jpeg, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
Label1: TLabel;
Image1: TImage;
Image2: TImage;
Label2: TLabel;
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
Form1: TForm1;
moveX, moveY: Integer;
mover: boolean;
implementation
{$R *.dfm}
type
TMoveControle = class(TControl);
procedure TForm1.ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift:
TShiftState; X, Y: Integer);
begin
moveX := X;
moveY := Y;
mover := True;
TMoveControle(Sender).MouseCapture := True;
end;
procedure TForm1.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 TForm1.ControlMouseUp(Sender: TObject;Button: TMouseButton; Shift:
TShiftState; X, Y: Integer);
begin
if mover then begin
mover := False;
TMoveControle(Sender).MouseCapture := False;
end;
end;
end.
Depois disso é só rodar, clicar no componente desejado e arrastar para qualquer
área do formulário.
<o:p>
</o:p>
Download do exemplo aqui.
Espero que seja útil!
Contato:
gustavo@activedelphi.com.br
Abraço e até a próxima.
|