我正在密切关注ONSelectCell事件
TSelectCellEvent =对象的程序(Sender:TObject; ACol,ARow:Longint; var CanSelect:Boolean);
我注意到TStringGrid.Selection.Top,Bottom属性不一定准确(在事件本身内).基本上,如果有人从选择多行到只有一行,则选择.*属性不会更新,而如果选择多行,则会更新.
无论是否选择了一行或多行,ARow参数都会更新,但只有在我确定选择了一行且只有一行时,这才会对我有所帮助.
例如,如果它只是选中的一行,则使用Arow参数,如果有多行,则使用Selection.*属性来确定当前选择的行.
必须有一个更简单的方法….
谢谢!
解决方法
在我继续之前,我想让你记住,聚焦细胞也可以(并且实际上)突出显示,但突出显示的细胞不一定是聚焦细胞.
现在,OnSelectCell事件与聚焦有关.单击单元格或尝试使用导航键在其上导航时会触发处理程序.简而言之,当尝试聚焦单元格时,将调用处理程序.您可以通过重置CanSelect参数来禁止对单元进行聚焦(同样,这也意味着CanFocus,因为可以选择单元格,即突出显示,而不是聚焦,并且您无法使用OnSelectCell控制它).
另一方面,goRangeSelect选项和TDrawGrid.Selection属性与选择突出显示有关.前者允许您(用户)突出显示多个单元格,而后者指向突出显示的那些单元格的范围.
现在到了我的主要观点.在调用有问题的处理程序时,选择永远不准确,即它与ACol&传递给处理程序的ARow参数.选择包含在调用处理程序之前突出显示的单元格范围,并且它在处理程序中不会自行更改.无论是一个单元格还是多个单元格,Selection都保持不变,直到处理程序退出.当发生这种情况时(处理程序退出),选择会发生变化(结果取决于您是否重置CanSelect,顺便说一下).
因此,总之,您不能使用OnSelectCell来确定实际选择作为用户最近操作的结果.相反,我会建议遵循@Sam的建议并使用OnMouseUp *事件.它还允许您控制选择:如果您认为用户选择了“太多”,您可以更正最终范围.在后一种情况下,我可能会考虑使用OnMouseMove,因为它可以让你通过“动态”修正范围来更顺畅地响应.
只要你需要确定选择,OnDrawCell似乎也很好.