2011-09-06 24 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

相關問題