2013-05-10 83 views
3

我的目標是創建一個簡單的表單編輯器,就像我們在Delphi IDE上找到的一樣。在Delphi中創建表單編輯器

現在用戶可以選擇並添加組件,使其成爲表單持有者的TPanel的父級。爲簡單起見,請考慮將TPanel作爲添加到表單的可視化組件。

我有2個缺少的部分我想找出想法/代碼,以幫助完成:

1 - 如何移動創建可視化組件?在IDE中用於移動可視化組件的相同效果,例如Tpanel,圍繞它的頂部和左側位置 2 - 如何在窗體編輯器中重點繪製該組件的鉤子3 - 如何使用鉤子調整大小

我只想要相關的部分來處理視覺部分。我不生成DFM或類似的東西。

回答

5

簡單地說你的移動代碼需要做到這一點:

  1. 當鼠標出現故障,檢查鼠標的位置是在可拖動控制。如果是,則設置一個名爲FDragControl的變量來引用該控件。此代碼位於事件處理程序的OnMouseDown中。
  2. 當鼠標移動時,如果FDragControl不爲零,請移動控件。此代碼位於OnMouseMove事件處理程序中。
  3. 當鼠標上升時,將FDragControl設置爲零。

這幾乎都是它的一切。主要的細微差別在於,當拖動開始時,您還必須記住鼠標的X,Y值。因此,在您OnMouseDown處理程序中寫:

FStartMousePos := Point(X, Y); 
FStartDragControlPos := Point(FDragControl.Left, FDragControl.Top); 

然後在OnMouseMove你的位置代碼讀取:

FDragControl.Left := FStartDragControlPos.X + (X-FStartX); 
FDragControl.Top := FStartDragControlPos.Y + (Y-FStartY); 

您還需要當你開始拖動捕獲鼠標。

調整大小的代碼是類似的。同樣,您需要在OnMouseDown中決定您調整大小而不是拖動,但代碼仍然涉及處理鼠標下移,移動和上移事件。至於繪畫,只要您的某個事件處理程序更改會影響窗體外觀的屬性,就需要強制重繪。您可以使用FDragControl的值來決定是否使用控件的特殊繪圖並指示它正在被拖動。同樣也適用於調整大小。

我沒有編寫完整的工作實現,因爲您的問題是高層次和概念性的。實施取決於你。

+0

很大!對調整有那些鉤子和控制周圍的框架是很重要的,怎麼可以做什麼? – 2013-05-10 13:23:14

+1

@eelias使用窗體'OnPaint'事件在窗體畫布上繪製它 – 2013-05-10 13:52:58

+2

有一個很好的組件,它是一個名爲Cindy Components的組件的一部分 - 您想要的組件稱爲cyResizer,它可以移動,調整大小並防止走出去說一個面板邊界等...鏈接:http://sourceforge.net/projects/tcycomponents/看到你認爲它是非常可定製的以及... – Shambhala 2013-05-10 15:19:42

1

搜索更多的答案我能找到這些文章:在運行時 http://delphi.about.com/library/weekly/aa102505a.htm

如何添加尺寸手柄在運行時調整大小控制

如何移動和調整控制 http://delphi.about.com/library/weekly/aa110105a.htm

用所有的信息來完成這個任務與源代碼的例子。

這些文章展示瞭如何實現和使用TMover類。我已經完成並正確工作。

我也下載了TcyComponents Pack並使用了TcyResizer。它是一個全功能的表單編輯器,幾乎可以滿足像表單編輯器這樣的Delphi所需的一切。我建議。它附帶源代碼,並且可以在XE2版本下正常工作。

+2

添加此爲該問題的更新。 – RBA 2013-05-10 15:42:02

2

//我已經做了這個答案,因爲我剛剛閱讀了你的最新更新,這本來應該是作爲對原始問題的修改而編寫的,但無論如何。

您可以下載Cindy組件包並使用cyResizer組件,該組件可以完成您需要的幾乎所有功能,並且可以自定義。

你可以從這裏下載:但是http://sourceforge.net/projects/tcycomponents/

+0

@eelias我不認爲你的答案應該是對問題的更新。但我也不認爲這是一個很好的答案。這只是網絡搜索的結果。任何人都可以做到。所以我不認爲你的答案實際上回答了這個問題。或者如果是這樣,那麼這個問題應該被封閉,因爲這不是一個真正的問題。 – 2013-05-12 20:23:42