002-窗体拖入Panel与内部拖动重排

问题来源

群里一位朋友,在开发的过程中,遇到一个产品需求。产品为在线教育,远程教育等操作时,会有多个视频窗口。

  • 产品需求希望将视频窗口单独显示出来。
  • 也可以根据用户需求,将所有窗口拖动到一个Panel里进行排序显示。
  • 并且在Panel内部时,也可以通过拖动进行重新排序。

思考与解决

  • 首先对窗体进行拖动,找到窗体拖动结束的事件。
  • 窗体拖动接受后,判断鼠标当前位置是否在目标Panel上,如果是,则置入,否则不操作。
  • 置入操作,可以通过改变窗体的Parent等属性进行调整。
  • 在Panel内部调整时,根据鼠标拖动结束后的位置判断,是否在Panel外,如果在外面,则将Form拉出Panel。
  • 至于在Panel内部拖动Form时不需要再做其他动作,在步骤2里已经进行了操作。

代码如下:

代码只需写在被拖动的窗体单元即可,这里我的主窗体为Form1,目标Panel名为Panel5,被拖动窗体为From2,From3,Form4。这里只给出Form2单元代码,Form3和Form4只需修改窗体名即可。

unit Unit2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  dxGDIPlusClasses, Vcl.ExtCtrls;
 
type
  TForm2 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WMExitSizeMove(var Message: TMessage); message WM_EXITSIZEMOVE;
  end;
 
var
  Form2: TForm2;
 
implementation
 
uses
  Unit1;
{<span class="katex math inline"><span class="err">ParseError: KaTeX parse error: Expected 'EOF', got '}' at position 8: R *.dfm}̲    procedure T…</span></span>F012, 0);
  end;
end;
 
procedure TForm2.WMExitSizeMove(var Message: TMessage);
begin
  if (Mouse.CursorPos.x > Form1.Panel5.Left + form1.Left) and (Mouse.CursorPos.x < Form1.Left + form1.Panel5.Left + form1.Panel5.Width) and (Mouse.CursorPos.y > form1.Top + form1.Panel5.Top) and (Mouse.CursorPos.y < Form1.top + form1.Panel5.Top + form1.Panel5.Height) then
  begin
    form2.Parent := Form1.Panel5;
    if Mouse.CursorPos.x - Form1.Left - form1.Panel5.Left < 50 then
    begin
      Form2.Left := -1;
    end
    else
    begin
      form2.Left := Mouse.CursorPos.x - Form1.Left - form1.Panel5.Left;
    end;
    form2.BorderStyle := bsnone;
    Form2.Align := alLeft;
    form2.Visible := True;
  end;
end;
 
end.

运行效果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值