我有一个颜料盒,我希望用户能够脱离并移动。因此,我将其DragKind设置为dkDock,并将其DragMode设置为dmAutomatic,然后将其放入DockSite设置为True的面板中。当我将绘画盒取消固定到 float 形式后将其固定时,我遇到了一个相当奇怪的行为。 float 表单的关闭按钮显示在面板内部。我已经附上了两个屏幕截图。一种是从原始状态开始的,另一种是在将颜料盒对接之后。我想念什么?

原始状态:

对接后:



更新
使用TLama解决方案后,结果如下。

最佳答案

您什么都不会错过。这就是默认的停靠管理器实现的工作方式。它只想使用带有停靠站点上的“关闭”按钮的采集卡。您可以做的是实现自己的扩展坞管理器并覆盖其 AdjustDockRect 方法,该方法控制扩展坞的大小,默认情况下,扩展坞管理器的实现通过关闭按钮为抓取器腾出空间。如果您不想要该采集卡,则只需将传递到方法中的停靠区矩形的大小保留为整个停靠站点的大小即可。换句话说,在该方法覆盖中不执行任何操作。

这是用于采集卡的功能部分,但是除了您需要截取它的硬编码图形外。为此,您需要覆盖 PaintDockFrame 事件方法,并且像以前一样,在此不执行任何操作。

这是一个代码示例:

type
  TNoGrabDockManager = class(TDockTree)
  protected
    procedure AdjustDockRect(Control: TControl; var ARect: TRect); override;
    procedure PaintDockFrame(Canvas: TCanvas; Control: TControl;
      const ARect: TRect); override;
  end;

implementation

{ TNoGrabDockManager }

procedure TNoGrabDockManager.AdjustDockRect(Control: TControl; var ARect: TRect);
begin
  // here you can make space for a grabber by shifting top or left position
  // of the ARect parameter, which is by default set to the whole dock site
  // bounds size, so if you do nothing here, there will be no grabber
end;

procedure TNoGrabDockManager.PaintDockFrame(Canvas: TCanvas; Control: TControl;
  const ARect: TRect);
begin
  // in this event method, the grabber with that close button are drawn, so
  // as in case of disabling grabber functionality do precisely nothing for
  // drawing it here, that will make it visually disappear
end;

这是使用此类自定义停靠管理器的方法(有关 UseDockManager 属性的注释,请参见下文):
procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel1.DockManager := TNoGrabDockManager.Create(Panel1);
  Panel1.UseDockManager := True;
end;

重要

很少有人指出,您应该在设计时将停靠面板的 UseDockManager 属性设置为False。我不知道为什么,但是从我进行的快速测试中,当我在设计时未设置该属性时,自定义停靠管理器的某些事件方法未触发(即使没有这样做,但我个人不会依靠它)。

关于delphi - 重定位后,“关闭”按钮出现在我的停靠控件上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14315093/

10-10 00:07