Delphi TSpTbxDock vs TSpTbxMultiDock

Delphi TSpTbxDock vs TSpTbxMultiDock,delphi,delphi-7,sptbxlib,Delphi,Delphi 7,Sptbxlib,在我当前的项目中,我有一个带有工具栏和面板的TTbxDock(TTbxDockablePanel)。移动TBX-->SpTBX后,我无法将面板(TSpTbxDockablePanel)放置在TSpTbxDock上。我看到一条运行时错误消息,说我无法将面板放置在基座上 我是否需要为面板使用TSpTbxMultiDock?为什么? 我是否可以将工具栏放置在TSpTbxMultiDock而不是TSpTBXDock上 i、 e.编写此类代码的原因: procedure TSpTBXCustomMu

在我当前的项目中,我有一个带有工具栏和面板的
TTbxDock
TTbxDockablePanel
)。移动TBX-->SpTBX后,我无法将面板(
TSpTbxDockablePanel
)放置在
TSpTbxDock
上。我看到一条运行时错误消息,说我无法将面板放置在基座上

  • 我是否需要为面板使用
    TSpTbxMultiDock
    ?为什么?
  • 我是否可以将工具栏放置在
    TSpTbxMultiDock
    而不是
    TSpTBXDock
i、 e.编写此类代码的原因:

procedure TSpTBXCustomMultiDock.ValidateInsert(AComponent: TComponent);
begin
  inherited;
  if not (AComponent is TSpTBXCustomDockablePanel) then
    raise EInvalidOperation.CreateFmt('Cannot insert %s into MultiDock', [AComponent.ClassName]);
end;

procedure TSpTBXCustomDockablePanel.ValidateContainer(AComponent: TComponent);
begin
  inherited;
  if (AComponent is TTBDock) and not (AComponent is TSpTBXCustomMultiDock) then
    raise EInvalidOperation.CreateFmt('Cannot insert %s into %s. Place it on a MultiDock instead', [Self.ClassName, AComponent.ClassName]);
end;
为什么我不能只使用一种类型的dock?

“我需要使用TSpTbxMultiDock来代替面板?为什么?” 简单的回答是,因为
TSpTBXMultiDock
组件被编写为仅处理和停靠
TSpTBXDockablePanel
s

很长的答案是,
TSpTBXMultiDock
组件被写入仅处理和停靠
TSpTBXDockablePanel
s,因为停靠代码依赖于它停靠的控件中的特定方法/属性。请参阅
TSpTBXCustomDockablePanel.SetParent
,它负责以下操作:它访问属性和方法
TSpTBXCustomMultiDock。

  • UpdateDockablePanelsDockPos
  • ClientAreaWidth
  • ClientAreaHeight
换句话说,停靠和布局代码需要知道某些信息,并要求停靠的控件执行某些操作。最简单的方法是将它可以停靠的控件类型约束到声明和实现所需接口的特定类的后代(松散地使用接口,没有(类)
接口
声明,它只是一组非正式的方法/属性)

通过快速扫描代码,我认为只有第一个,
UpdateDockablePanelsDockPos
,才是真正必要的。我可能错过了什么。但此方法会获取所有停靠面板的列表,并更新每个面板的
DockPos
,这是面板中停靠的一维位置。也就是说,对于水平面板,它是左/水平起点,对于垂直面板,它是顶部/垂直起点。它还更新了总数,以便小组知道它必须有多大,或者如果它选择的话可以有多大

我不太确定我是否回答了你的问题。我觉得我给出了一个正确的答案,但不是一个有用的答案(以上是技术原因,而不是概念上的原因),这需要深入了解你在做什么。我猜你问这个问题是因为你正在努力进行TBX->SpTBX迁移,并且你想要能够处理工具栏和可固定面板的固定区域。幸运的是,这两个问题都引出了你的第二个问题

“我可以将工具栏放在TSpTbxMultiDock上吗?” 我正在进入记忆的领域,我不能保证这部分答案是正确的,因为我很久很久以前就将我们的应用程序从TBX转换成了SpTBX

首先,不可以,您不能将
TSpTBXToolbar
放置在可固定面板上。您也不能将
tsptbxdockable面板
停靠在
TSpTBXDock
上。工具栏可以停靠到停靠中,可停靠面板可以停靠到多停靠中

原因是猜测,但我想这是因为两个停靠控件的不同行为及其用途

工具栏:

  • 用于包含SpTBX项(按钮、下拉列表等,而不是任何普通VCL控件、按钮等),并且可以动态地从工具栏更改为菜单等,例如,随着窗体大小的调整和工具栏的缩小
  • 堆栈:以及它们之间有任意大小的空间(不同于固定面板,它们总是相邻放置),工具栏可以在它们之间有空间;他们坐在用户放他们的地方。他们也经常坐在几排,一个船坞扩展并包含几排
  • 设计用于收缩:表单可能变得太小,或者用户可以将工具栏拖到另一个工具栏上,而工具栏将只显示它可以显示的项目,或者隐藏其他项目,或者显示一个V形按钮(一个小小的>>按钮,用于打开包含其他项目的菜单)
可停靠面板:

  • 用于容纳复杂的控件,包括标准VCL控件——它们是一种工具栏和停靠系统兼容的方式,用于构建复杂的停靠表单。(我们设计为框架,客户将框架与可固定面板对齐。)
  • 很少在几行上。这取决于您作为UI实现者,但是许多靠在一起的面板可能会迅速填满表单空间。我们为可固定面板启用LimitToOneRow,因此它们只能填充一个维度(即,在表单的左侧和右侧,可固定面板只能位于彼此的上方和下方,而不能位于彼此的左侧和右侧)
  • 调整大小的行为是不同的:它们总是相邻的,中间没有间隙(工具栏可以放在任何地方),并且通常会拉伸一个或多个面板以填充整个基座(工具栏不会,除非设置了
    菜单栏
    (见下文)),事实上,工具栏的设计是收缩,而不是增长,并显示一个V形和下拉菜单。面板没有这种行为
在转移注意力之后,回到你的问题。当我们转换我们的应用程序时,我记得我想知道如果用户想要创建一个布局,这样就有工具栏,然后是一个可固定面板,然后是工具栏,以便尽可能地混合这两种类型,会发生什么。这样做需要一个dock,然后是一个multidock,然后是一个dock,但实际上这会导致用户能够创建非常复杂和混乱的布局。可停靠UI的一个问题是,许多用户发现它们令人困惑(老实说,您可能会感到困惑)