2011-09-06 30 views
2

我使用Delphi的'常规'对接(DockSite = True和UseDockManager = True)。现在有几个DockSite控件和几个可停靠的表单。但是,并非每个可停靠的表单都应该在每个码头站点中进行。如何知道控制装置的停靠位置,以及如何防止停靠?

表格知道它们应该停靠在哪种控件上;控制权,OTOH,不知道接受与否的形式。

我的问题,现在是,有几个事件要停止的地方,你可以取消拖/放(或拖动/码头)操作:的dragover,StartDock等,但这些都发生在“接收”的一面,从来没有在正在被放弃的控制方面;这就是我想要的地方 - 因此,停靠的表单可以拒绝停靠某个控件。

有没有这样的事件,我可以忽略一些事情,还是我不得不以不同的方式解决这个问题?

+0

如果设置正确,取消两侧的底座应该可以正常工作。是否有理由拒绝停靠码头的目的地不适合你? –

+0

我希望这些表格尽可能“可插入”,并且包含所有必要的逻辑(以及对业务类的引用);但我想让目标控件免于任何有关它们将包含的表单的知识。将来,我可能需要添加新的(类)可停靠表单。 – Martijn

+0

难道你不能使用可停靠表单的基类吗?这将显着减少控件的占用空间。 –

回答

1

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

0

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

+0

一旦控件开始被拖动,'OnStartDock'就会被触发。当DragKind是dkDock时,它是控件的OnStartDrag对应部分。然后没有任何暗示控制权将停靠在哪里。 –

+0

就像塞尔塔克说的:在目标控制已知之前,OnStartDock被触发。而且我无法从'DragDockObject'中找到任何方法:它的'DragTarget'属性直接读取和写入字段,所以没有任何方法可以覆盖。 – Martijn

相关问题