delphi 如何手动让控件移动

delphi 怎么手动让控件移动
自动挡的容易 只要让 form 的 Docksize 改为 True 再把 控件的 Dragkind 改成 dock DragMode 改成 dmAutomatic 就可以自动移动了,可是 一不小心把浮动的控件关闭了 就不见了 怎么调出来? 
每次浮动的时候都有自动生成的临时小窗口作控件的临时 hostdocksize 有没有什么办法 不让这个小窗口出现呢?
手动档的时候 我处理了 button 的 mousedown 要是 Button 为 mbleft  的时候就 发送 begindrag (False) 
还在form 的 dragover 判断要是 Tbutton 的话就 accept := True ; 为什么控件动不起来。 是不是要在dragdrop 里设置他的位移?可是 我dragover 都允许他 移动 放下了啊
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure FormDragDrop(Sender, Source: TObject; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation       

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.DockSite := True;    // 初始化 form1 让他接受控件移动

  // 改 button1 控件为手动档
  Button1.DragKind := dkDrag;
  Button1.DragMode := dmManual;
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbleft then
  Button1.BeginDrag(False);     //要是左键拖动的话 就移动
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if Source is TButton then
  begin
    Accept := True;                   // 要是 拖动的类型是 TButton 的话就允许
  end;                                // 我这里允许了 还需要用 enddrag 吗
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
        // 这里是不是要处理移动? 还是他自己会动
        //这样他才动,可是我认为应该不用自己来设置吧
        //dragover 的 accept 都允许了 他就会进这里来啊
//        if Source is TButton then
//          begin
//             Button1.Left := x;
//             Button1.Top := y;
//          end;

end;

end.



大家帮我看看  怎么让手动移动的 
------解决方案--------------------
要在MouseMove中写事件,定义位置的时候要用与父控件的相对位置
------解决方案--------------------
Procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
  ReleaseCapture;
  BitBtn1.perform(WM_SysCommand, $F012, 0);
End;
------解决方案--------------------
mousedown
mousemove
mouseup
三个事件里都需要写代码
计算鼠标位置,然后设置组件的left和top