问题描述:新建delphi工程,在Form1中放置Panel1控件,并在Panel1中并排放置Label1和Edit1控件。要求:1. 拖动鼠标时,Label1和Edit1会随鼠标而动,但其相对位置不变;2. Label1和Edit1始终在Panel1的边界内移动。
代码:
var
G_Can_Move: boolean; //用于控制只有当鼠标按下时才能移动
G_X, G_Y: integer; //用于保存鼠标按下时的位置,
//如果不考虑这个点,鼠标第一下移动时Label1和Edit1的位置变化会比较大
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X, //鼠标移动事件
Y: Integer);
begin
if(G_Can_Move = true) then
begin
if not((Label1.Top + Y - G_Y) < 0) and not((Edit1.Top + Y - G_Y) < 0) //上边界
and not ((Label1.Top + Y - G_Y + Edit1.Height) > Panel1.Height) then //下边界
begin
Label1.Top:= Label1.Top + Y - G_Y;
Edit1.Top:= Edit1.Top + Y - G_Y;
end; //if
if not((Label1.Left + X - G_X) < 0) //左边界
and not((Label1.Left + X - G_X + Label1.Width + Edit1.Width + (Edit1.Left - Label1.Left -Label1.Width)) > Panel1.Width) //右边界
then
begin
Label1.Left:= Label1.Left + X - G_X;
Edit1.Left:= Edit1.Left + X - G_X;
end; //if
end; //if(G_Can_Move = true)
end;
procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton; //鼠标按下事件
Shift: TShiftState; X, Y: Integer);
begin
G_Can_Move:= true; //能移动
//鼠标按下时的位置
G_X:= X;
G_y:= Y;
end;
procedure TForm1.Label1MouseUp(Sender: TObject; Button: TMouseButton; //放开鼠标时
Shift: TShiftState; X, Y: Integer);
begin
G_Can_Move:= false; //不能移动
end;