加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Delphi TStringGrid中检测单个与多个选择

发布时间:2020-12-15 04:13:00 所属栏目:大数据 来源:网络整理
导读:这是我之前关于Delphi String Grids的问题 Delphi TStringGrid multi select,determining selected rows的后续内容.这是一个不同的问题. 我正在密切关注ONSelectCell事件 TSelectCellEvent =对象的程序(Sender:TObject; ACol,ARow:Longint; var CanSelect
这是我之前关于Delphi String Grids的问题 Delphi TStringGrid multi select,determining selected rows的后续内容.这是一个不同的问题.

我正在密切关注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似乎也很好.

*在您的评论之后,我必须补充一点,您还必须使用OnKeyUp来处理键盘选择.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读