2010-11-20 278 views
1

我在OnMouseDown事件中調用BeginDrag(False,10)。 爲什麼OnStartDrag立即被調用?Delphi:BeginDrag(False)和OnStartDrag

我使用OnStartDrag進行一些「重度」初始化,我不希望它在簡單的點擊時被解僱。

鼠標行爲正常(鼠標移動後光標發生變化),但事件觸發很快!

請幫忙!!!

回答

0

這是一個錯誤,至少我已經遇到過使用BDS 2006,但不知道更新的Delphi版本。

2

爲什麼要立即調用OnStartDrag?

因爲BeginDrag與Immediate和Threshold參數幾乎沒有任何關係(除了檢查Threshold是否爲負數),只是將它們傳遞給Controls單位中的DragInitControl。

DragInitControl過程首先檢查DragKind是否爲dkDrag,如果是;那麼它會調用調用OnStartDrag事件的DoStartDrag方法。稍後,在DragInitControl代碼的末尾,將調用DragInit來執行實際的拖動作業。

我不知道這是否是有意設計的,或者是在VCL中實現拖拽的錯誤。在Delphi文件它says

如果立即爲假,鼠標 指針不會更改的值DragCursor財產 和 拖動纔開始 將鼠標移動用戶指針 數由閾值 參數指定的像素。

同樣對於OnStartDrag文檔says

當用戶開始拖動 控制或通過左擊控制和 按住鼠標按鈕向下它包含 一個對象時發生。

對我來說,如果Immediate是False,並且鼠標沒有移動,拖動不會開始;因此,OnStartDrag不應該被調用。

+0

Vcldeveloper,感謝您的清晰和詳細的解釋,但事實上,我知道之前,我寫在這裏。現在我正在尋找一個不錯的,乾淨的解決方案。我傾向於認爲這是一個執行錯誤。是否有機會修復?嘿,Embarcadero?拖動過程開始時,鼠標光標以正確的方式更改。當鼠標光標發生變化或真正的拖動過程開始時,我可以攔截,掛鉤,還是有一些WM_可以捕捉?再次感謝。 – Marcodor 2010-11-21 21:10:12

相關問題