7

我有一个油漆盒,我希望用户能够卸下并四处移动。所以我将其设置DragKinddkDock和其设置DragModedmAutomatic,并将其放入DockSite设置为的面板中True。当我将油漆盒取消停靠到浮动形式后停靠时,我遇到了一种相当奇怪的行为。浮动表单的关闭按钮出现在面板内。我附上了两张截图。一个是原始状态,一个是重新对接油漆盒后的状态。我错过了什么?

原始状态:

脱离前

对接后:

对接后


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

对接后; 使用新的码头管理器

4

2 回答 2

4

你没有错过任何东西。这就是默认停靠管理器实现的工作方式。它只是想在使用它的停靠站点上使用带有关闭按钮的抓取器。您可以做的是实现您自己的停靠管理器并覆盖其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。我不知道为什么,但是从我所做的快速测试来看,当我在设计时没有设置该属性时,自定义停靠管理器的一些事件方法没有被触发(AdjustDockRect即使没有做,事件方法也能正常工作所以,但我个人不会依赖它)。

于 2013-01-22T14:32:05.027 回答
2

不要使用面板作为停靠目标,而是使用 TPageControl 并从生成的选项卡表中隐藏选项卡。由于页面控件通常具有可见选项卡,因此不显示删除句柄。不幸的是,当您隐藏选项卡表的选项卡时,工作表本身也会被隐藏。因此,您必须通过添加以下 OnDockDrop 事件来保存和恢复它:

procedure TForm2.PageControl1DockDrop(Sender: TObject; Source: TDragDockObject;
  X, Y: Integer);
var
  ix: Integer;
begin
  ix := PageControl1.ActivePageIndex;
  PageControl1.ActivePage.TabVisible := false;
  PageControl1.ActivePageIndex := ix;
end;
于 2016-09-08T13:59:38.227 回答