上一篇:拖动窗体的任意区域移动窗体
下一篇:Delphi图片按钮

Delphi拖动控件

发布于: 2012-12-15 15:38:32   |  发布在: Delphi文章   |  点击:

1. 新建一个Delphi工程

2. 在窗体上放置一个TPanel控件,在TPanel控件上放置一个TLabel控件,将Tlabel的DragMode属性设置成:dmAutomatic(默认为dmManual

3. 添加两个全局变量

  iMouseX, iMouseY: Integer; //用于保存鼠标在TLabel控件上的坐标。

4. 添加Label1的OnDragOver事件响应代码

//如果不响应该事件,则在Label1上按下鼠标而又还没拖动时,鼠标指针会变为crNoDrop
procedure TForm1.Label1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := True;
end;

5. 添加Label1的OnMouseMove事件响应代码
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  iMouseX := X;
  iMouseY := Y;
end;

6. 添加Panel1的OnDragOver事件响应代码
procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Label1.Left := X - iMouseX;
  Label1.Top := Y - iMouseY;
end;

7. 编译并运行程序,就可以在Panel1范围内随意拖动Label1控件了。

注:如果需要让拖动结束后才把Label控件放到新位置,而不是让Label控件跟着鼠标一起移动,则需要做以下修改:
添加两个全局变量
iPanelX, iPanelY: Integer; //用于保存鼠标在Panel1控件上的坐标


将Panel1控件的OnDragOver事件响应代码改成:
procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  iPanelX := X;
  iPanelY := Y;
end;

添加Label1控件的OnEnDrag事件响应代码
procedure TForm1.Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
  Label1.Left := iPanelX - iMouseX;
  Label1.Top := iPanelY - iMouseY;
end;

全文完。

拖动