iMa*_*ari 7 delphi docking delphi-xe2
我有一个油漆盒,我希望用户能够移除和移动.所以我设置了DragKind以dkDock及其DragMode对dmAutomatic,并把它在面板内部与DockSite集来True.当我将油漆盒与浮动形状脱开后,我在遇到油漆盒时会遇到一种相当奇怪的行为.浮动窗体的关闭按钮出现在面板内.我附上了两个截图.一个来自原始状态,一个再次对接油漆盒.我错过了什么?
原始状态:

对接后:

更新 使用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;
Run Code Online (Sandbox Code Playgroud)
以下是如何使用此类自定义停靠管理器(有关UseDockManager属性的说明,请参见下文):
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1.DockManager := TNoGrabDockManager.Create(Panel1);
Panel1.UseDockManager := True;
end;
Run Code Online (Sandbox Code Playgroud)
重要的
正如很少有消息来源所建议的那样,您应该UseDockManager在设计时将停靠面板的属性设置为 False。我不知道为什么,但从我所做的快速测试来看,当我在设计时没有设置该属性时,自定义停靠管理器的某些事件方法不会被触发(即使AdjustDockRect没有执行该事件方法也能正常工作)所以,但我个人不会依赖它)。
| 归档时间: |
|
| 查看次数: |
1465 次 |
| 最近记录: |