2009-05-25 74 views
7

在Delphi 2006(我認爲)引入了TFlowPanel和TGridPanel之前,我做了一個概念上類似的控件。它仍然有一些控件不能做的事情,當我將代碼升級到Delphi 2009時,我決定爲它添加一些增強功能。在Delphi中進行設計時拖放?

現在,子控件的順序由其創建順序決定。 FlowPanel和GridPanel通過ControlIndex和其他過濾的屬性顯示出更好的方式,但我想知道是否有辦法在設計時處理拖放重新排序?據我所知,將編輯控件拖放到面板上並不會調用我可以在設計時訪問的任何東西。

我對想要直接檢測拖放操作的方法有半想,或者可能檢測何時移動控件,以便確定它應該放在哪裏。

任何想法?

更新: 好的,讓它工作。容器控件已經覆蓋了AlignControls來管理控件的位置。當您拖動嵌套控件並放下它時,AlignControls再次被調用。然後,我將控件的新座標與列表中的其他控件進行比較,並將其移至適當的位置。

有一些問題需要我去解決(主要涉及對AlignControls的很多調用),但基本概念很簡單。感謝所有評論者提供的所有幫助。

+0

「子控件的順序是由它們的創建順序決定的」命令是什麼? Tab順序?你是否想讓它們在一個面板中從上到下按順序排列? – Serguzest 2009-05-25 09:44:55

+0

現在,如果您選擇面板並向其添加控件,控件將按照您添加的順序進行佈局。要重新排序,您需要將文本剪切並粘貼或查看,然後將其移動。我現在已經添加了一個ControlIndex屬性和一個TFlowPanel,但希望控件的用戶只需拖放即可重新排序。因此,抓住Edit2並將其放在Edit1的左側,它們奇蹟般地交換面板上的位置。 – 2009-05-25 09:49:01

回答

5

您無法拖動表單上已有的控件並將其放到面板上。拖動只是爲移動一個控件,而不是用於更改其父項。要更改父級,請剪切並粘貼。

如果控件已經在面板上,並且想要將其移動到面板上的其他位置,那麼面板可以通過覆蓋TWinControl.AlignControls方法來控制佈局。當一個控件被移動時,它的SetBounds方法被調用,並且發生的事情是它在其父窗口上調用AlignControl(Self)。那叫AlignControls。看看Controls.pas,你會發現這是一個複雜的方法,但是它負責控制上的孩子的佈局,這正是你打算改變的。

+0

嗨羅布, 我想我不太清楚我的意圖重新控制放在我的容器 - 看到我對約翰的評論的迴應。 關於使用AlignControls處理重新排序,你當然是對的。我已經使用AlignControls來安排孩子,但現在我完全忽略了左側和頂部的屬性。我擔心的是,考慮到這些因素會很難確定何時添加控件以及何時嘗試重新訂購控件。 我會盡力並報告。 – 2009-05-26 09:21:54

0

您是否試圖爲您的網格組件編寫一個「OnDragDrop」事件,以檢查組件是否處於設計模式?

我還沒有寫過這樣的組件,但我不明白爲什麼這個事件不應該觸發。

+0

嗨LeGEC。 我還沒有嘗試使用OnDragDrop,但好像所有其他鼠標事件都被窗體設計器攔截,所以您永遠不會收到控件被拖動的通知。 – 2009-05-26 09:16:39

3

也許這些建議中的一些可能會有所幫助。

您可以重新設計設計師的控件,而無需進行剪切和粘貼。查看結構窗格,只需將可視控件拖動到結構窗格中另一個父項的節點。如果您在流程面板中有東西,請將所有內容都拖出流程面板,然後按照您希望的順序將其拖回。

(您可以再父任何視覺控制這種方式,在不改變比其父其他任何東西。我強烈建議做這種方式。)

您可以查看的形式爲文本,並移動聲明順序在那裏 - 但顯然你需要小心直接編輯「資源」文件。

您可以在設計器中設置Tab鍵順序,以便您可以根據Tab鍵的順序進行不同的控制,這可以根據需要進行。您可以右鍵單擊表單並更改非可視控件的創建順序,但不適用於可視控件。