TStringGrid脏黑客 - 将选择限制为一行

时间:2010-07-17 19:33:29

标签: delphi

我有一个基于TStringGrid的大量修改控件。我想允许用户在此网格中进行选择,但将选择限制为单行(当前行)。

实现: 当用户按下鼠标左键时,我正在使用脏黑客攻击:在OnMouseDown事件中,我捕获鼠标光标并将其保留在当前行上。用户可以在其打击垫上上下移动鼠标设备,但光标不会上升或下降。它将保留在当前行。当用户释放按钮(OnMouseUp事件)时,我释放捕获。

然而,这个黑客就像我说的那么脏。有几个问题。例如,如果用户按下鼠标左键(LMB)然后在没有释放该按钮的情况下按下右键,则会弹出相关的弹出菜单,但永远不会释放鼠标捕获。因此,鼠标将被锁定在屏幕区域,直到用户有一个绝妙的想法再次点击LMB来解锁鼠标。这可能是D7中的一个错误。这里有一篇单独的帖子:TStringGrid - OnMouseUp is not called!

有一种优雅的方法可以做到这一点吗?


编辑: OnSelectCell无效。单击单元格时,仅调用一次OnSelectCell事件。如果按住该按钮并移动鼠标以展开选择,则不会再次调用OnSelectCell。 事实上,MoveCurrent只出现在TCustomGrid.MouseDown。

3 个答案:

答案 0 :(得分:1)

使用OnSelectCell事件并根据ARow参数是否符合要求设置CanSelect var参数。

答案 1 :(得分:0)

这个答案根本不优雅,但它确实有效。

我的解决方案是不使用StringGrid的PopupMenu属性。相反,我实现了自己的PopUpMenu属性。工作几乎完美。有一个小问题,弹出菜单的底部出现在光标旁边,而不是它的顶部。

答案 2 :(得分:0)

一个不错的解决方案

检查TStringGrid上的options属性 有一个名为'goRangeSelect'的选项 使用对象检查器

将其设置为false

或者以编程方式这可以通过

来完成
StringGrid1.Options - [goRangeSelect];