【问题标题】:TStringGrid with BOTH editing AND range selection?具有编辑和范围选择的 TStringGrid?
【发布时间】:2010-05-18 20:43:13
【问题描述】:

问题:

任何人都可以在任何地方指向一篇文章或代码示例,了解如何 在 TStringGrid 中提供编辑和范围选择?

是的,我知道有第三方网格可以做到这一点,但它是 令人沮丧的是内置网格缺乏这种基本功能。

背景:

期望能够同时编辑网格中的单元格是很正常的, 并且还可以选择一系列单元格,例如用于复制操作。

在交付时,TStringGrid 不这样做。这是非此即彼的。事实上, 文档告诉我们有关网格选项的信息,“当 goEditing 包含在 选项,goRangeSelect 无效”。

但是,看起来可以进行编辑和范围选择 无论如何在 TStringGrid 中!!!通过仔细使用mousedown, mouseup, selectcell 和 exit 事件,你可以通过切换来关闭 在正确的时间打开和关闭元素。但我还是没有 它很完美,而且只涉及鼠标使用,不包括键盘更改。

【问题讨论】:

    标签: delphi vcl tstringgrid


    【解决方案1】:

    我没有为此使用TStringGrid,所以我无法提供具体答案。但是我是否正确地假设您可以manually (in code) start a cell being edited?该链接意味着即使网格在其Options 中不包含goEditing 也是可能的。 (如果不是这样,请参阅下文以解决此问题。)

    如果是这样,我建议采用以下方法:

    组合选择和编辑行为

    我发现这是一种很好的 Windows 标准行为方法:

    • 让网格处于选择模式,以便鼠标和键盘交互选择单元格

    • 根据某些标准触发自己正在编辑的单元格(我认为根据您在上一段中所说的内容,您正在这样做。)触发编辑的常用方法,以下标准是我的当程序对其他控件执行类似操作时,它们会跟随:

      • 选择正常。即点击选择、点击拖动多选、使用键盘箭头和Shift或Control选择等。

      • 一个单元格enters edit mode 时:

        1. 选择了一个单元格,用户按下EnterF2F2 是标准的“重命名”或“编辑”快捷方式,适用于许多程序)

        2. 用户“慢速双击”单元格 - 即慢速双击以选择和编辑,或在暂停后再次单击已选择的单元格。这模仿了资源管理器的行为,如果选择了一个文件并且您稍后单击它,它将进入内联编辑/重命名模式。要实现这一点,请记录最后一次单击(并选择)单元格的时间。如果再次单击它,并且时间大于GetDoubleClickTime,则它们缓慢地单击了两次,然后进入编辑模式。这使您可以区分第一次单击以选择、双击(执行某种操作)和缓慢的第二次单击以进入编辑模式。

          我也倾向于检查鼠标位置,因此如果一个对象被慢速双击并且它不是首先被选择的(即,这既选择了对象,然后进入编辑模式)我验证鼠标没有' t 非常感动。我使用GetSystemMetrics 查找双击距离,并检查慢速双击是否在此框内。 (因为不是真正的双击,所以我实际上检查了距离乘以2。我的动作代码是:

          const int iMAX_MOVE_AMOUNT = ::GetSystemMetrics(SM_CYDOUBLECLK) * 2;(抱歉,C++ 不是 Delphi,但应该很容易转换!)

          但我实际上不确定这是否完全 100% 符合 Windows 指南。但在实践中,用户发现它可以正常工作。)

    这应该可以让您在适当的时间使用键盘和鼠标在选择和编辑之间切换。

    杂念

    通过继承TStringGrid 并创建一个新组件,您可能会发现其中一些更简洁、更容易实现。这将允许您在普通代码中实现这一点并覆盖内置行为(而不是事件处理程序),同时使其对表单代码不可见。与简单地通过诸如OnMouseDown 之类的事件公开相比,它还将为您提供对鼠标事件或Windows 消息的较低级别的访问权限。最后,如果在goEditing 包含在Options 中时显示编辑器有问题,这将允许您更改该行为。如果您希望代码响应发生的某些事情,例如创建OnBeginEdit 事件,您也可以添加自己的事件。

    创建自己的组件通常被认为是高级 Delphi 主题,但实际上一旦你知道如何操作就会非常容易!This site 有一些很好的主题将向你介绍该主题,如果你走这条路遇到问题,Stack Overflow 当然是一个提问的好地方 :) Embarcadero Delphi » VCL » Writing Components 新闻组/论坛也是一个很好的资源,实际上对于这个特定主题甚至可能比 SO 更好。

    希望有帮助!

    【讨论】:

      【解决方案2】:

      是的,这是旧帖子,但问题仍然存在于 Delphi XE3 上。 为了管理这个特性,我在 SelectCell 过程中使用了下一个“技巧”: if (ARow = StringGridParam.Row) then begin StringGridParam.Options:= StringGridParam.Options + [goEditing] - [goRowSelect]; end else begin StringGridParam.Options:= StringGridParam.Options + [goRowSelect] - [goEditing]; end;

      【讨论】:

      • 如果您将确切的代码添加到 OnCellClick 事件中,效果会更好。
      猜你喜欢
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多