⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 movepanel.pas

📁 可移动的Panel。用户可以随意控制自己的Panel。
💻 PAS
字号:
{---------------------------------------------
            MovePanel Component
            version: 1.0
            date: 2004/12/18
            author: vber
 ---------------------------------------------}

{
  This component will automatically move while mousedown and move.
}

unit MovePanel;

interface
uses
  Classes, Windows, Extctrls, Controls;

type
  TMoveOption = (moBoth, moLeft, moTop);
  TMoveEvent = procedure (Sender: TObject; X, Y: Integer) of Object;
  TMovePanel = class(TPanel)
  private
    FMouseDown: Boolean;
    FCanMove: Boolean;
    FMoveOption: TMoveOption;
    {When moLeft: Moving without changing it's Top value
     When moTop:  Moving without changing it's Left value
    }
    FMoveEvent: TMoveEvent;
    FMoveFinished: TNotifyEvent;
    LastPoint: TPoint;

    procedure DoOnMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
    procedure DoOnMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
    procedure DoOnMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
    procedure DoCanMove(const Value: Boolean);
  published
    property CanMove: Boolean read FCanMove write DoCanMove default True;
    property MoveOption: TMoveOption read FMoveOption write FMoveOption default moBoth;
    property OnMove: TMoveEvent read FMoveEvent write FMoveEvent;
    property OnMoveFinished: TNotifyEvent read FMoveFinished write FMoveFinished;
  public
    constructor Create(AOwner: TComponent);override;
  end;

  procedure Register;
  
implementation

{ TMovePanel }

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

constructor TMovePanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FCanMove := True;
  FMouseDown := False;
  FMoveOption := moBoth;

  OnMouseMove := DoOnMouseMove;
  OnMouseDown := DoOnMouseDown;
  OnMouseUp:= DoOnMouseUp;
end;

procedure TMovePanel.DoCanMove(const Value: Boolean);
begin
  FCanMove := Value;
  if not Value then FMouseDown := False;
end;

procedure TMovePanel.DoOnMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if not FCanMove then Exit;

  FMouseDown := True;

  GetCursorPos(LastPoint);
end;

procedure TMovePanel.DoOnMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  NowPoint: TPoint;
begin
  if not FMouseDown then Exit;

  GetCursorPos(NowPoint);

  case FMoveOption of
    moLeft:
          Left := Left + NowPoint.X - LastPoint.X;
    moTop:
          Top := Top + NowPoint.Y - LastPoint.Y;
    moBoth:
          begin
            Left := Left + NowPoint.X - LastPoint.X;
            Top := Top + NowPoint.Y - LastPoint.Y;
          end;
  end;

  LastPoint := NowPoint;

  if Assigned(FMoveEvent) then FMoveEvent(Sender, Left, Top);  
end;

procedure TMovePanel.DoOnMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FMouseDown := False;
  if Assigned(FMoveFinished) then FMoveFinished(Self);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -