【问题标题】:How do I know where a control will be docked, and how do I prevent the docking?我如何知道控件将停靠在哪里,以及如何防止停靠?
【发布时间】:2011-11-11 09:42:33
【问题描述】:

我正在使用 Delphi 的“常规”对接(DockSite = True 和 UseDockManager = True)。现在有几个 DockSite 控件和几个可停靠表单。但是,并非每个可停靠表单都应该放在每个停靠站点中。

表单知道它们应该停靠什么样的控件;控件,OTOH,不知道接受或不接受什么形式。

我现在的问题是,有几个事件发生了,您可以在其中取消拖放(或拖放)操作:DragOver、StartDock 等。但这些都发生在“接收”端,从不在被丢弃的控件的一侧;这就是我想拥有它的地方——以便停靠的表单可以拒绝停靠到某个控件。

是否存在这样的事件,是我忽略了什么,还是我必须以不同的方式解决这个问题?

【问题讨论】:

  • 如果设置正确,取消任一侧的扩展坞应该可以正常工作。拒绝停靠的目的地是否对您不起作用?
  • 我希望表单尽可能“可插入”,并包含所有必要的逻辑(以及对业务类的引用);但我想让目标控件不了解它们将包含的表单。将来,我可能需要添加新的(类)可停靠表单。
  • 你不能为你的可停靠表单使用基类吗?这将显着减少控件的占用空间。
  • 我知道这在 JVCL Jvdocking 控件提供的扩展停靠功能中是可能的。
  • @JerryGagnon:使用基类如何减少停靠控件的占用空间?

标签: delphi vcl docking


【解决方案1】:

我想我应该将其添加为答案,而不仅仅是评论。为您的自定义表单创建一个基本表单并将您的逻辑放入其中。然后每个控件只需要知道如何与一个表单类进行交互。您制作的每个新对接形式都必须从这个基本形式下降。这样做的好处是您不需要制作自定义版本的控件,因为一切都可以通过标准事件处理程序处理。

【讨论】:

    【解决方案2】:

    OnStartDock 事件是针对正在停靠的控件/表单触发的,而不是针对正在停靠的 DockSite 控件。因此,您可以将 OnStartDock 事件处理程序分配给您的可停靠表单,或者更好地覆盖虚拟 DoStartDock() 方法。

    【讨论】:

    • OnStartDock 在开始拖动控件时立即触发。当 DragKind 是 dkDock 时,它是控件的 OnStartDrag 对应项。没有任何提示,然后控件将停靠在哪里。
    • 就像 Sertac 所说:OnStartDock 在目标控件已知之前被触发。而且我也无法从DragDockObject 内部检测到它:它的DragTarget 属性直接读取和写入该字段,因此我无法覆盖任何方法。
    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2017-02-28
    • 2011-12-02
    相关资源
    最近更新 更多