delphi 控件的拖动

下页强 2015-07-17 02:07:48
procedure TForm2.btMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
flag_dragging :=True;
startpoint :=Point(x,y) ;
lastpoint :=Point(x,y) ;
end;

procedure TForm2.btMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
dx,dy:Integer ;
begin
if flag_dragging then
begin
dx:= x-lastpoint.X;
dy:=y-lastpoint.Y ;
lastpoint:=point(x,y);
TRzShapeButton (Sender).Left:= TRzShapeButton (Sender).Left+ dX;
TRzShapeButton (Sender).top:= TRzShapeButton (Sender).top+ dy;
end;
end;

procedure TForm2.btMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
q:string;
dx,dy:Integer ;
begin
if Flag_Dragging then
begin
Flag_Dragging := False;
LastPoint := Point(X, Y);
Dx := LastPoint.X - StartPoint.X;
Dy := LastPoint.Y - StartPoint.Y;
TRzShapeButton (Sender) .Top := Dy + TRzShapeButton (Sender).Top;
TRzShapeButton (Sender).Left := Dx + TRzShapeButton (Sender).Left;



以上代码是我拖动button位置的主要代码,但是好像哪里不对,求大神帮助看一下呗,多谢了!!!
...全文
328 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
下页强 2015-07-18
  • 打赏
  • 举报
回复
@lyhoo163 谢谢大神。我试过了。呵呵,,,正是我想要的效果。
lyhoo163 2015-07-18
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, RzButton;

type
TForm1 = class(TForm)
RzShapeButton1: TRzShapeButton;
Button1: TButton;
procedure RzShapeButton1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure RzShapeButton1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
procedure RzShapeButton1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
isMouseDown : boolean ; // 是否拖拽
posX,posY : Integer; // 拖动开始时候的坐标

implementation

{$R *.dfm}

procedure TForm1.RzShapeButton1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
isMouseDown := True; // 开始拖动
posX := Mouse.CursorPos.X - RzShapeButton1.Left ; // 记录开始的X坐标
posY := Mouse.CursorPos.Y - RzShapeButton1.Top ; // 记录开始的y坐标
end;

procedure TForm1.RzShapeButton1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if isMouseDown then // 鼠标是按下状态(可以拖)
begin
RzShapeButton1.Left := Mouse.CursorPos.X - posX ; // 设置新的X位置(Left)
RzShapeButton1.Top := Mouse.CursorPos.Y - posY ; // 设置新的Y位置(Top)
end;
end;

procedure TForm1.RzShapeButton1MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
isMouseDown := False; // 拖动结束
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;

end.

lyhoo163 2015-07-18
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

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 }
  end;

var
  Form1: TForm1;
  isMouseDown : boolean ; // 是否拖拽
  posX,posY : Integer;    // 拖动开始时候的坐标

implementation

{$R *.dfm}

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  isMouseDown := True;                          // 开始拖动
  posX := Mouse.CursorPos.X  - Button1.Left ;   // 记录开始的X坐标
  posY := Mouse.CursorPos.Y  - Button1.Top  ;   // 记录开始的y坐标
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if isMouseDown  then                           // 鼠标是按下状态(可以拖)
  begin
    Button1.Left := Mouse.CursorPos.X - posX ;   // 设置新的X位置(Left)
    Button1.Top := Mouse.CursorPos.Y - posY ;    // 设置新的Y位置(Top)
  end;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  isMouseDown := False;                          // 拖动结束
end;

end.
下页强 2015-07-17
  • 打赏
  • 举报
回复
@道玄希言 大神,你的方法我试了的,可以移动呢。但是移动的过程中那个button是看不见的,知道停止移动,那个按钮才显现出来呢??? 如果移动过程中他都可以看见,要怎么办呢???
道玄希言 2015-07-17
  • 打赏
  • 举报
回复
在 btMouseDown 纪录下 TRzShapeButton 坐标. MOVE 的是相对初始坐标(鼠标按下时坐标)移动的, 所以, 你控件的初始坐标也需要纪录. 计算当前位置, 就是控件初始位置相对当前位置的位移.


btnx, btny : integer ;

procedure TForm2.btMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   flag_dragging :=True;
   startpoint :=Point(x,y) ;
   lastpoint :=Point(x,y)   ;
   btnx  :=  TRzShapeButton (Sender).Left ;
   btny  :=  TRzShapeButton (Sender).Top;
end;


procedure TForm2.btMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  var
  dx,dy:Integer ;
begin
     if flag_dragging  then
     begin
       dx:= x-lastpoint.X;
       dy:=y-lastpoint.Y ;
       lastpoint:=point(x,y);
      TRzShapeButton (Sender).Left:= btnx + dX;
      TRzShapeButton (Sender).top:= btny + dy;
     end;
end;

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧