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





Article #17936: Moving a control at runtime with the mouse.

 Question and Answer Database

FAQ2936D.txt   Moving a control at runtime with the mouse.
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