我以下代码是想当鼠标拖拽ShpST1是,松开鼠标后ShpST1在 鼠标当前位置 ,可是当我仅在ShpST1内拖拽时,会跑到莫名奇妙的位置,当拖拽在ShpST1外部时,则能满足要求?这是什么原因?怎样解决?
在ShpST1内拖拽时得到的位置X,Y不是Form1的X,Y吗?procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
   if (Sender is TShape) then
      accept:=true;
end;
procedure TForm1.ShpST1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin  if (Source is TShape) then
     accept:=true;
end;procedure TForm1.ShpST1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
  ShpST1.Brush.Color:=clHighLight;     ShpST1.Left:=X-ShpST1.Width div 2;
     ShpST1.Top:=Y-ShpST1.Height div 2;end;procedure TForm1.ShpST1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbLeft then
     (Sender as TShape).BeginDrag(false);
end;   

解决方案 »

  1.   

    试试这个代码,BCB的,可以拖动Button1:
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
        ReleaseCapture();
        SendMessage( Button1->Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);    
    }
    //---------------------------------------------------------------------------
      

  2.   

    procedure TForm1.ShpST1EndDrag(Sender, Target: TObject; X, Y: Integer);
    begin
      ShpST1.Brush.Color:=clHighLight;     ShpST1.Left:=X-ShpST1.Width div 2;
         ShpST1.Top:=Y-ShpST1.Height div 2;end;
    这个中的X和Y是屏幕的坐标,不是Form的坐标
      

  3.   

    那怎么变成 Form的X,Y坐标呢?
      

  4.   

    var
      P: TPoint;
    begin
      P := Form1.ScreenToClient(Point(X, Y));
      ShpST1.Left:=P.X-ShpST1.Width div 2;
      ShpST1.Top:=P.Y-ShpST1.Height div 2;
    //...