2010-07-17 26 views
1

我有一個基於TStringGrid嚴重修改的控制。我想允許用戶在這個網格中進行選擇,但限制選擇一行(當前行)。TStringGrid髒黑客 - 限制選擇到一個單一的行

執行: 當用戶按下鼠標左鍵我正在使用一個骯髒的黑客:OnMouseDown事件捕獲鼠標光標,並將其保留在當前行。用戶可以在鼠標墊上上下移動鼠標,但光標不會上下移動。它將保持在當前行。當用戶釋放按鈕(OnMouseUp事件)時,我釋放捕獲。

但是,這個黑客正如我說的很髒。有幾個問題。例如,如果用戶按下鼠標左鍵(LMB),然後不釋放該按鈕,則會按下右按鈕,相關的彈出式菜單將彈出,但鼠標捕捉將永遠不會釋放。因此,鼠標將被鎖定在屏幕區域,直到用戶將有一個絕妙的想法再次點擊LMB來解鎖鼠標。這可能是D7中的一個錯誤。有一個單獨的帖子在這裏:TStringGrid - OnMouseUp is not called!

有一個優雅的方式來做到這一點?


編輯: OnSelectCell無法正常工作。單擊單元格時,OnSelectCell事件僅被調用一次。如果您按住按鈕並移動鼠標以擴展選擇,則不會再次調用OnSelectCell。 確實MoveCurrent只出現在TCustomGrid.MouseDown中。

+1

不要限制鼠標移動!用戶會恨你並停止使用你的軟件。 – 2010-07-19 20:09:46

回答

0

這個答案根本不算優雅,但它的工作原理。

我的解決方案是不使用StringGrid的PopupMenu屬性。相反,我實現了我自己的PopUpMenu屬性。工作幾乎完美。有一個小問題,彈出式菜單的底部出現在光標旁邊,而不是頂端。

1

使用OnSelectCell事件並根據是否需要ARow參數來設置CanSelect var參數。

+0

它不工作。單擊單元格時,OnSelectCell僅被調用一次。如果您按住按鈕並移動鼠標以擴展選擇,則不會再次調用OnSelectCell。 – Ampere 2010-07-19 17:49:31

+0

@Altar,我相信這種奇怪的行爲是由網格的「選項」中的goRangeSelect造成的。既然你只允許單行選擇範圍選擇沒有多大意義。嘗試關閉該選項... – 2010-07-20 01:56:03

0

一個很好的解決方案

檢查TStringGrid 選項屬性有使用對象檢查

或者編程可以做到這一點稱爲「goRangeSelect」 設置爲false的選項由

StringGrid1.Options - [goRangeSelect]; 
相關問題