我想在窗体上拖动button控件,但是又不能让它拖出边界,有没有这个边界的控制函数呢?
拖动的代码写好了
如:
 procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    screen.Cursor := crSizeAll;
    PBoxMoving := True;
    MouseOrg := Point(x,y);
  end
  else
    PBoxMoving := False;
end;procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if PBoxMoving then
  begin
    PBoxMoving := False;
    screen.Cursor := crDefault;
  end;
end;procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if PBoxMoving then
  begin
    button1.Left := button1.Left + ( x - MouseOrg.X);
    button1.Top := button1.Top + ( y- MouseOrg.Y);
  end
end;

解决方案 »

  1.   

    //参考如下代码~~
    procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      vRect: TRect;
    begin
      if Button = mbLeft then
      begin
        screen.Cursor := crSizeAll;
        PBoxMoving := True;
        MouseOrg := Point(x,y);
        vRect.Left := TControl(Sender).Parent.ClientOrigin.X + X;
        vRect.Top := TControl(Sender).Parent.ClientOrigin.Y + Y;
        vRect.Right := TControl(Sender).Parent.ClientOrigin.X +
          TControl(Sender).Parent.ClientWidth - TControl(Sender).Width + X;
        vRect.Bottom := TControl(Sender).Parent.ClientOrigin.Y +
          TControl(Sender).Parent.ClientHeight - TControl(Sender).Height + Y;
        ClipCursor(@vRect);
      end
      else
        PBoxMoving := False;
    end;procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if PBoxMoving then
      begin
        PBoxMoving := False;
        screen.Cursor := crDefault;
        ClipCursor(nil);
      end;
    end;
      

  2.   

    非常感谢 zswang(伴水清清)(专家门诊清洁工)的回答
    不过还想问你一个问题:
     我在用width 的时候总是分不清楚
    例如:
       ClientWidth,和Width的区别是什么?
    也就是说clientWidth 比width 小的那部分指的是什么,如果窗体
    多了一个滚动条,那么clientwidth 包括滚动条吗?   
      

  3.   

    还有个问题是ClientOrigin是一个什么坐标
    ClipCursor函数限制的区域矩形的坐标是相对于屏幕还是窗体呢?
      

  4.   

    procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if PBoxMoving then
      begin
        PBoxMoving := False;
        screen.Cursor := crDefault;
        ClipCursor(nil);
      end;
    end;
      

  5.   

    ClipCursor函数限制的区域矩形的坐标是相对于屏幕还是窗体呢?
      

  6.   

    ClientWidth、ClientHeight
    都是客户区的宽高,不把标题栏和边框计算在内~~
    自己改成Width、Height看效果~~
      

  7.   

    多了一个滚动条,那么clientwidth 包括滚动条吗
    ----------------
    少问多测~~