Главная страница | назад





Article #16490: Moving controls at runtime

 Question and Answer Database

FAQ1490D.txt   Moving controls at runtime
Category   :VCL
Platform    :All
Product    :All 32 bit  

Question:
How can I move a control at runtime using the mouse?


Answer:
You can trap the OnMouseDown event, remembering the x and y
coordinates of the mouse and set the mouse capture. You can 
then track mouse movements with the OnMouseMove event, moving 
the control until the OnMouseUp event is fired. You then will 
want to place the control in it's final position and release 
capture of the mouse.

The following example shows how to move a TButton component 
around on the form using the mouse. The movement is initiated 
by the user holding down the control key when the mouse button 
is activated.

Example:

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Button1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
    MouseDownSpot : TPoint;
    Capturing : bool;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ssCtrl in Shift then begin
    SetCapture(Button1.Handle);
    Capturing := true;
    MouseDownSpot.X := x;
    MouseDownSpot.Y := Y;
  end;
end;

procedure TForm1.Button1MouseMove(Sender: TObject;
Shift: TShiftState; X,  Y: Integer);
begin
  if Capturing then begin
    Button1.Left := Button1.Left - (MouseDownSpot.x - x);
    Button1.Top := Button1.Top - (MouseDownSpot.y - y);
  end;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Capturing then begin
    ReleaseCapture;
    Capturing := false;
    Button1.Left := Button1.Left - (MouseDownSpot.x - x);
    Button1.Top := Button1.Top - (MouseDownSpot.y - y);
  end;
end;


7/16/98 4:31:28 PM
 

Last Modified: 01-SEP-99