unit MovePanel;

interface
uses
  Windows, Classes, Controls,ExtCtrls;
type
  TMovePanel = class(TPanel)  //这个控件是继承Tpanel类的
  private
    PrePoint:TPoint;
    Down:Boolean;
    { Private declarations }
  protected
    { Protected declarations }
  public
  	constructor Create(AOwner:TComponent);
	override;
  	//重载鼠标事件，抢先处理消息
procedure MouseDown(Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);override;
   	procedure MouseUp(Button: TMouseButton; 
Shift: TShiftState; X, Y: Integer);override;
   	procedure MouseMove(Shift: TShiftState;
 X, Y: Integer);override;
 	{ Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

constructor TMovePanel.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);	//继承父类的Create方法
end;

procedure TMovePanel.MouseDown(Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if (Button=MBLeft) then
    begin
    Down:=true;
    GetCursorPos(PrePoint);
    end;
  //如果方法已存在，就触发相应事件去调用它，若不加此语句会造成访存异常
 if assigned(OnMouseDown) then
  	OnMouseDown(self,Button,shift,x,y);
end;

procedure TMovePanel.MouseUp(Button: 
TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if (Button=MBLeft) and Down then
  	Down:=False;
  if assigned(OnMouseUp) then
  	OnMouseUp(Self,Button,shift,X,y);
end;

procedure TMovePanel.MouseMove(Shift:
 TShiftState; X, Y: Integer);
Var
  NowPoint:TPoint;
begin
  if down then
    begin
GetCursorPos(nowPoint);
//self.Parent在Form中就是MovePanel所在的窗体，或是MovePanel所在的容器像Panel
    self.Parent.Left:=self.Parent.left
	+NowPoint.x-PrePoint.x;
    self.parent.Top:=self.Parent.Top
	+NowPoint.y-PrePoint.y;
    PrePoint:=NowPoint;
    end;
  if Assigned(OnMouseMove) then
  	OnMouseMove(self,Shift,X,y);
end;

procedure Register;
begin
  RegisterComponents('Data Controls', [TMovePanel]);
end;

end.
