Delphi 如何通过拖动面板或框架或其中的任何组件来移动面板或框架?

Delphi 如何通过拖动面板或框架或其中的任何组件来移动面板或框架?,delphi,vcl,delphi-xe6,Delphi,Vcl,Delphi Xe6,在一个白色的全屏形式,我将有七帧来自同一来源。我想用鼠标移动它们,并在退出时保存该位置,以便以后加载到同一位置。我可以移动一个面板,如果我按住鼠标并移动它,从我得到的代码 但是,如果我在面板内点击WinControl,当然我不会从面板上获得OnMouseDown 如何移动面板(或框架)移动其中的任何控件而不对其拥有的每个组件进行编码?下面是一个快速示例,它解释了覆盖所指的内容: TTransparentPanel = class(TPanel) protected procedure WME

在一个白色的全屏形式,我将有七帧来自同一来源。我想用鼠标移动它们,并在退出时保存该位置,以便以后加载到同一位置。我可以移动一个面板,如果我按住鼠标并移动它,从我得到的代码

但是,如果我在面板内点击WinControl,当然我不会从面板上获得OnMouseDown


如何移动面板(或框架)移动其中的任何控件而不对其拥有的每个组件进行编码?

下面是一个快速示例,它解释了覆盖所指的内容:

TTransparentPanel = class(TPanel)
protected
  procedure WMEraseBkGnd(var msg: TWMEraseBkGnd); message WM_ERASEBKGND;
  procedure CreateParams(var params: TCreateParams); override;
end;

procedure TTransparentPanel.CreateParams(var params: TCreateParams);
begin
  inherited CreateParams(params);
  params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT;
end;

procedure TTransparentPanel.WMEraseBkGnd(var msg: TWMEraseBkGnd);
begin
  SetBkMode (msg.DC, TRANSPARENT);
  msg.result := 1;
end;
在表格中,您有如下内容:

procedure TFormTest.FormCreate(Sender: TObject);
begin
  FTransparentPanel := TTransparentPanel.Create(Self);
  FTransparentPanel.Parent := self;
  FTransparentPanel.Align := alClient;
  FTransparentPanel.Visible := True;
  FTransparentPanel.OnMouseDown := FormMouseDown;
  FTransparentPanel.OnMouseUp := FormMouseUp;
  FTransparentPanel.OnMouseMove := FormMouseMove;
end;

procedure TFormTest.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift:
    TShiftState; X, Y: Integer);
var
  I: Integer;
begin
  // Check if there is a control under X, Y
  FMoveControl := nil;
  for I := 0 to ControlCount - 1 do
  begin
    if Controls[I] <> FTransparentPanel then
    begin
      if (Controls[I].Left <= X) and (Controls[I].Top <= Y) and
         ((Controls[I].Left + Controls[I].Width) >= X) and ((Controls[I].Top + Controls[I].Height) >= Y) then
      begin
        FMoveControl := Controls[I];
        break;
      end;
    end;
  end;
  if Assigned(FMoveControl) then
  begin
    FStartLeft := FMoveControl.Left;
    FStartTop := FMoveControl.Top;
    FStartX := X;
    FStartY := Y;
  end;
end;

procedure TFormTest.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y:
    Integer);
begin
  // Move it
  if Assigned(FMoveControl) then
  begin
    FMoveControl.Left := FStartLeft + (X - FStartX);
    FMoveControl.Top := FStartTop + (Y - FStartY);
  end;
end;

procedure TFormTest.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift:
    TShiftState; X, Y: Integer);
begin
  FMoveControl := nil;
end;
过程TFormTest.FormCreate(发送方:TObject);
开始
ftTransparentPanel:=ttTransparentPanel.Create(Self);
ftTransparentPanel.Parent:=自身;
ftTransparentPanel.Align:=alClient;
ftTransparentPanel.Visible:=真;
ftTransparentPanel.OnMouseDown:=FormMouseDown;
ftTransparentPanel.OnMouseUp:=FormMouseUp;
ftTransparentPanel.OnMouseMove:=FormMouseMove;
结束;
步骤t用于测试FormMouseDown(发送方:ToObject;按钮:TMouseButton;Shift:
t移位状态;X,Y:整数);
变量
I:整数;
开始
//检查X,Y下是否有控件
FMoveControl:=零;
对于I:=0到ControlCount-1 do
开始
如果控制[I]ftTransparentPanel,则
开始
如果(控制[I]。左=Y),则
开始
FMoveControl:=控制[I];
打破
结束;
结束;
结束;
如果已分配(FMOVERCONTROL),则
开始
FStartLeft:=FMoveControl.Left;
FStartTop:=FMoveControl.Top;
FStartX:=X;
FStartY:=Y;
结束;
结束;
步骤t FORMTEST.FORMOUSEMOVE(发送方:ToObject;Shift:tShift状态;X,Y:
整数);
开始
//移动它
如果已分配(FMOVERCONTROL),则
开始
FMoveControl.Left:=fstartlef+(X-FStartX);
FMoveControl.Top:=FStartTop+(Y-FStartY);
结束;
结束;
步骤t用于测试FormMouseUp(发送方:ToObject;按钮:TMouseButton;Shift:
t移位状态;X,Y:整数);
开始
FMoveControl:=零;
结束;

当您移动控件时,它会闪烁一点,但会让您了解如何继续操作。

您不会。您必须在每个单独的子控件上检测鼠标活动,然后根据需要操纵父面板/框架。最简单的方法是添加一个透明覆盖,并使用它来处理拖动。然后找出需要移动的控件并移动该控件。您可以禁用子控件。DragTable标记通常用于jQuery DragTable,而不是一般的“在某个可视化控件库中拖动控件”,这就是为什么相关列表都与Java和jQuery相关(至少在我发布此注释时)。如果您不确定某个标记是否适用,请不要使用它,发布您的问题,访问一些带有您不确定标记的问题,如果它确实适用,您可以编辑您的问题并添加它。请不要随便抓取任何与你发布的内容有模糊关联的东西。谢谢,这是一个开始。我应该使用什么作为透明覆盖层?