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

📄 udrag.pas

📁 运行时设计控件的一个小例子
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    end else if FPointRec.RightTop.isDown then begin
     MoveRightTopPoint;
     reSizeCon
    end else if FPointRec.RightButton.isDown then begin
     MoveRightBottomPoint;
     reSizeCon
    end else if FPointRec.LeftMid.isDown then begin
     MoveLeftMidPoint;
     reSizeCon
    end else if FPointRec.TopMid.isDown then begin
     MoveTopMidPoint;
     reSizeCon
    end else if FPointRec.RightMid.isDown then begin
     MoveRightMidPoint;
     reSizeCon
    end else if FPointRec.ButtonMid.isDown then begin
     MoveBottomMidPoint;
     reSizeCon
    end
  end;
end;

//----------------------------------------------------------------------------//
procedure TDragClass.PointMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if Button= mbLeft then begin
     if (FpointRec.LeftTop.isDown) and (Sender=FpointRec.LeftTop) then
       FpointRec.LeftTop.isDown:=False
     else if (FpointRec.LeftBottom.isDown) and (Sender=FpointRec.LeftBottom) then
       FpointRec.LeftBottom.isDown:=False
     else if (FpointRec.RightTop.isDown) and (Sender=FpointRec.RightTop) then
       FpointRec.RightTop.isDown:=False
     else if (FpointRec.RightButton.isDown) and (Sender=FpointRec.RightButton) then
       FpointRec.RightButton.isDown:=False
     else if (FpointRec.LeftMid.isDown) and (Sender=FpointRec.LeftMid) then
       FpointRec.LeftMid.isDown:=False
     else if (FpointRec.TopMid.isDown) and (Sender=FpointRec.TopMid) then
       FpointRec.TopMid.isDown:=False
     else if (FpointRec.RightMid.isDown) and (Sender=FpointRec.RightMid) then
       FpointRec.RightMid.isDown:=False
     else if (FpointRec.ButtonMid.isDown) and (Sender=FpointRec.ButtonMid) then
       FpointRec.ButtonMid.isDown:=False;
   end;
end;

//----------------------------------------------------------------------------//
//左顶点的移动
procedure TDragClass.MoveLeftTopPoint;
var
  offsetX,offsetY:Integer;
begin
  GetCursorPos(FPointRec.LeftTop.NextP);
  offsetX:=FPointRec.LeftTop.NextP.X-FPointRec.LeftTop.PrevP.X;
  offSetY:=FPointRec.LeftTop.NextP.Y-FPointRec.LeftTop.PrevP.Y;
  if not FisMoveStep then begin
   FPointRec.LeftTop.Left:=FPointRec.LeftTop.Left+offsetX;
   FPointRec.LeftTop.Top:=FPointRec.LeftTop.Top+offsetY;
  end else begin
   MoveX:=MoveX+offsetX;
   MoveY:=MoveY+offsetY;
   if Abs(moveX)>=FMoveStep then begin
     FPointRec.LeftTop.Left:=FPointRec.LeftTop.Left+moveX;
     moveX:=0;
   end;
   if Abs(moveY)>=FMoveStep then begin
     FPointRec.LeftTop.Top:=FPointRec.LeftTop.Top+moveY;
     moveY:=0;
   end;
  end;
  FPointRec.LeftTop.PrevP:=FPointRec.LeftTop.NextP;
  AlignLeftTop;
end;

//----------------------------------------------------------------------------//
//其他点对齐左右点
procedure TDragClass.AlignLeftTop;
begin
   FPointRec.LeftBottom.Left:=FPointRec.LeftTop.Left;
   FPointRec.RightTop.Top:=FPointRec.LeftTop.Top;
   FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:= (FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:= (FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.RightMid.Top:= (FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
   FPointRec.ButtonMid.Left:= (FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;

//----------------------------------------------------------------------------//
//对齐点
procedure TDragClass.AlignLeftBottom;
begin
   FPointRec.LeftTop.Left:=FPointRec.LeftBottom.Left;
   FPointRec.RightButton.Top:=FPointRec.LeftBottom.Top;
   FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=(FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:=(FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.RightMid.Top:=(FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
   FPointRec.ButtonMid.Top:=FPointrec.LeftBottom.Top;
   FPointRec.ButtonMid.Left:=(FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;

//----------------------------------------------------------------------------//
//移动左底点
procedure TDragClass.MoveLeftBottomPoint;
var
  offsetX,offsetY:Integer;
begin
  GetCursorPos(FPointRec.LeftBottom.NextP);
  offsetX:=FPointRec.LeftBottom.NextP.X-FPointRec.LeftBottom.PrevP.X;
  offSetY:=FPointRec.LeftBottom.NextP.Y-FPointRec.LeftBottom.PrevP.Y;
  if not FisMoveStep then begin
   FPointRec.LeftBottom.Left:=FPointRec.LeftBottom.Left+offsetX;
   FPointRec.LeftBottom.Top:=FPointRec.LeftBottom.Top+offsetY;
  end else begin
   MoveX:=MoveX+offsetX;
   MoveY:=MoveY+offsetY;
   if Abs(moveX)>=FMoveStep then begin
     FPointRec.LeftBottom.Left:=FPointRec.LeftBottom.Left+moveX;
     moveX:=0;
   end;
   if Abs(moveY)>=FMoveStep then begin
     FPointRec.LeftBottom.Top:=FPointRec.LeftBottom.Top+moveY;
     movey:=0;
   end;
  end;
  FPointRec.LeftBottom.PrevP:=FPointRec.LeftBottom.NextP;
  AlignLeftBottom;
end;

//----------------------------------------------------------------------------//
//对齐点
procedure TDragClass.AlignRightTop;
begin
   FPointRec.LeftTop.Top:=    FPointRec.RightTop.top;
   FPointRec.RightButton.Left:=FPointRec.RightTop.Left;
   FPointRec.LeftMid.Left:=   FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=    (FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.TopMid.Top:=     FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:=    (FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.RightMid.Left:=  FPointRec.RightTop.Left;
   FPointRec.RightMid.Top:=   (FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
   FPointRec.ButtonMid.Top:=  FPointrec.LeftBottom.Top;
   FPointRec.ButtonMid.Left:= (FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;

//----------------------------------------------------------------------------//
//移动右上点
procedure TDragClass.MoveRightTopPoint;
var
  offsetX,offsetY:Integer;
begin
  GetCursorPos(FPointRec.RightTop.NextP);
  offsetX:=FPointRec.RightTop.NextP.X-FPointRec.RightTop.PrevP.X;
  offSetY:=FPointRec.RightTop.NextP.Y-FPointRec.RightTop.PrevP.Y;
  if not FisMoveStep then begin
   FPointRec.RightTop.Left:=FPointRec.RightTop.Left+offsetX;
   FPointRec.RightTop.Top:=FPointRec.RightTop.Top+offsetY;
  end else begin
   MoveX:=MoveX+offsetX;
   MoveY:=MoveY+offsetY;
   if Abs(moveX)>=FMoveStep then begin
     FPointRec.RightTop.Left:=FPointRec.RightTop.Left+moveX;
     moveX:=0;
   end;
   if Abs(moveY)>=FMoveStep then begin
     FPointRec.RightTop.Top:=FPointRec.RightTop.Top+moveY;
     moveY:=0;
   end;
  end;
  FPointRec.RightTop.PrevP:=FPointRec.RightTop.NextP;
  AlignRightTop;
end;

//----------------------------------------------------------------------------//
//对齐点
procedure TDragClass.AlignRightBottom;
begin
   FPointRec.LeftBottom.Top:=FPointRec.RightButton.top;
   FPointRec.RightTop.Left:=FPointRec.RightButton.Left;
   FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=(FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:=(FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.RightMid.Left:=FPointRec.RightTop.Left;
   FPointRec.RightMid.Top:=(FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
   FPointRec.ButtonMid.Top:=FPointrec.LeftBottom.Top;
   FPointRec.ButtonMid.Left:=(FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;

//----------------------------------------------------------------------------//
//移动右底点
procedure TDragClass.MoveRightBottomPoint;
var
  offsetX,offsetY:Integer;
begin
  GetCursorPos(FPointRec.RightButton.NextP);
  offsetX:=FPointRec.RightButton.NextP.X-FPointRec.RightButton.PrevP.X;
  offSetY:=FPointRec.RightButton.NextP.Y-FPointRec.RightButton.PrevP.Y;
  if not FisMoveStep then begin
   FPointRec.RightButton.Left:=FPointRec.RightButton.Left+offsetX;
   FPointRec.RightButton.Top:=FPointRec.RightButton.Top+offsetY;
  end else begin
   MoveX:=MoveX+offsetX;
   MoveY:=MoveY+offsetY;
   if Abs(moveX)>=FMoveStep then begin
     FPointRec.RightButton.Left:=FPointRec.RightButton.Left+moveX;
     moveX:=0;
   end;
   if Abs(moveY)>=FMoveStep then begin
     FPointRec.RightButton.Top:=FPointRec.RightButton.Top+moveY;
     moveY:=0;
   end;
  end;
  FPointRec.RightButton.PrevP:=FPointRec.RightButton.NextP;
  AlignRightBottom;
end;

//----------------------------------------------------------------------------//
//对齐点
procedure TDragClass.AlignLeftMid;
begin
   FPointRec.LeftTop.Left:=FPointRec.LeftMid.Left;
   FPointRec.LeftBottom.Left:=FPointRec.LeftMid.Left;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:= (FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.ButtonMid.Top:=FPointrec.LeftBottom.Top;
   FPointRec.ButtonMid.Left:=(FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;

//----------------------------------------------------------------------------//
//左中点
procedure TDragClass.MoveLeftMidPoint;
var
  offsetX:Integer;
begin
  GetCursorPos(FPointRec.LeftMid.NextP);
  offsetX:=FPointRec.LeftMid.NextP.X-FPointRec.LeftMid.PrevP.X;
  if not FisMoveStep then begin
   FPointRec.LeftMid.Left:=FPointRec.LeftMid.Left+offsetX;
  end else begin
   MoveX:=MoveX+offsetX;
   if Abs(moveX)>=FMoveStep then begin
     FPointRec.LeftMid.Left:=FPointRec.LeftMid.Left+moveX;
     moveX:=0;
   end;
  end;
  FPointRec.LeftMid.PrevP:=FPointRec.LeftMid.NextP;
  AlignLeftMid;
end;

//----------------------------------------------------------------------------//
//对齐点
procedure TDragClass.AlignTopMid;
begin
   FPointRec.LeftTop.Top:=FPointRec.TopMid.Top;
   FPointRec.RightTop.Top:=FPointRec.TopMid.Top;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=(FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.RightMid.Left:=FPointRec.RightTop.Left;
   FPointRec.RightMid.Top:=(FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
end;

//----------------------------------------------------------------------------//
//顶中点
procedure TDragClass.MoveTopMidPoint;
var
  offsetY:Integer;
begin
  GetCursorPos(FPointRec.TopMid.NextP);
  offSetY:=FPointRec.TopMid.NextP.Y-FPointRec.TopMid.PrevP.Y;
  if not FisMoveStep then begin
   FPointRec.TopMid.Top:=FPointRec.TopMid.Top+offsetY;
  end else begin
   MoveY:=MoveY+offsetY;
   if Abs(moveY)>=FMoveStep then begin
     FPointRec.TopMid.Top:=FPointRec.TopMid.Top+moveY;
     moveY:=0;
   end;
  end;
  FPointRec.TopMid.PrevP:=FPointRec.TopMid.NextP;
  AlignTopMid;
end;

//----------------------------------------------------------------------------//
//对齐点
procedure TDragClass.AlignRightMid;
begin
   FPointRec.RightTop.Left:=FPointRec.RightMid.Left;
   FPointRec.RightButton.Left:=FPointRec.RightMid.Left;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:=(FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.ButtonMid.Top:=FPointrec.LeftBottom.Top;
   FPointRec.ButtonMid.Left:=(FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;

//----------------------------------------------------------------------------//
//右中点
procedure TDragClass.MoveRightMidPoint;
var
  offsetX:Integer;
begin
     GetCursorPos(FPointRec.RightMid.NextP);
     offsetX:=FPointRec.RightMid.NextP.X-FPointRec.RightMid.PrevP.X;
     if not FisMoveStep then begin
       FPointRec.RightMid.Left:=FPointRec.RightMid.Left+offsetX;
     end else begin
       MoveX:=MoveX+offsetX;
       if Abs(moveX)>=FMoveStep then begin
         FPointRec.RightMid.Left:=FPointRec.RightMid.Left+moveX;
         moveX:=0;
       end;
     end;
     FPointRec.RightMid.PrevP:=FPointRec.RightMid.NextP;
     AlignRightMid;
end;

//----------------------------------------------------------------------------//
//对齐点
procedure TDragClass.AlignBottomMid;
begin
   FPointRec.LeftBottom.Top:=FPointRec.ButtonMid.Top;
   FPointRec.RightButton.Top:=FPointrec.ButtonMid.Top;
   FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=(FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.RightMid.Left:=FPointRec.RightTop.Left;
   FPointRec.RightMid.Top:=(FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
end;

//----------------------------------------------------------------------------//
//底中点
procedure TDragClass.MoveBottomMidPoint;
var
  offsetY:Integer;
begin
  GetCursorPos(FPointRec.ButtonMid.NextP);
  offSetY:=FPointRec.ButtonMid.NextP.Y-FPointRec.ButtonMid.PrevP.Y;
  if not FisMoveStep then begin
   FPointRec.ButtonMid.Top:=FPointRec.ButtonMid.Top+offsetY;
  end else begin
   MoveY:=MoveY+offsetY;
   if Abs(moveY)>=FMoveStep then begin
     FPointRec.ButtonMid.Top:=FPointRec.ButtonMid.Top+moveY;
     moveY:=0;
   end;
  end;
  FPointRec.ButtonMid.PrevP:=FPointRec.ButtonMid.NextP;
  AlignBottomMid;
end;

//----------------------------------------------------------------------------//
//重定位控件的尽寸
procedure TDragClass.reSizeCon;
var
  Con:TControl;
begin
  Con:=TControl(FConList.Items[FCurActiveCon]);
  Con.Left:=FPointRec.LeftTop.Left+FPointRec.LeftTop.Width;
  Con.Top:=FPointRec.LeftTop.Top+FPointRec.LeftTop.Height;
  Con.Width:=FPointRec.RightTop.Left-Con.Left;
  Con.Height:=FPointRec.LeftBottom.Top-Con.Top;
end;

//----------------------------------------------------------------------------//
//设置控件移动时是否用跳跃式的移动
procedure TDragClass.SetisMoveStep(value: Boolean);
begin
  if FisMoveStep<>value then
    FisMoveStep:=Value;
end;

//----------------------------------------------------------------------------//
//设置控件移动跳跃的距离
procedure TDragClass.SetMoveStep(value: integer);
begin
  if Value<5 then
     FMoveStep:=5
  else if Value>20 then
     FMoveStep:=20
  else
     FMoveStep:=Value;
end;

//----------------------------------------------------------------------------//
procedure TDragClass.DeleteControl(index: integer);
begin
  FConList.Delete(index);
end;

end.

⌨️ 快捷键说明

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