问题:
任何人都可以指向任何地方的文章或代码示例 在TStringGrid中提供BOTH编辑和范围选择?
是的,我知道有第三方网格可以做到这一点,但确实如此 令人沮丧的是,内置网格缺乏这种基本功能。
背景:
期望能够同时编辑网格中的单元格是很正常的, 还可以选择一系列单元格,例如复制操作。
交付时,TStringGrid不会这样做。它是/或。事实上, doc告诉我们有关网格选项的信息,“goEditing包含在 选项,goRangeSelect没有效果“。
但是,看起来可以进行编辑和范围选择 无论如何在TStringGrid!通过仔细使用mousedown, mouseup,selectcell和exit事件,你可以通过切换得到关闭 在正确的时间打开和关闭元素。但我还是没有 它很完美,而且只包括鼠标使用,而不是键盘更改。
答案 0 :(得分:3)
我没有使用TStringGrid
,所以我无法提供具体的答案。但我是否正确地假设你可以manually (in code) start a cell being edited?该链接意味着即使网格中goEditing
中没有Options
,也可以使用该链接。 (如果不是这样,请参见下文解决此问题。)
如果是这样,我建议采用以下方法:
我发现这是一种很好的,Windows标准行为的方法:
将网格保留为选择模式,因此鼠标和键盘交互选择单元格
根据特定条件触发正在编辑的单元格(我认为您正在按照上一段中所述的方式执行此操作。)有一些常用的触发编辑方法,以及以下条件是我的程序在执行与其他控件类似的操作时所遵循的:
选择正常。即,单击选择,单击并拖动以进行多选,使用键盘箭头和Shift或Control进行选择等。
以下任何一个单元格enters edit mode:
选择了一个单元格,用户按下Enter
或F2
(F2
是标准的“重命名”或“编辑”快捷方式,该快捷方式适用于多个程序)
用户在单元格上“慢速双击” - 即慢速双击以选择和编辑,或在暂停后再次点击已选择的单元格。这模仿了资源管理器的行为,如果选择了一个文件并稍后单击它,它将进入内联编辑/重命名模式。要实现此功能,请记录最后一次单击(并选择)单元格的时间。如果再次单击该单元格,如果时间大于GetDoubleClickTime
,则表示他们已慢慢单击两次,然后进入编辑模式。这使您可以区分第一次单击以进行选择,双击(以执行某种操作)和慢速第二次单击,以进入编辑模式。
我也倾向于检查鼠标位置,这样如果一个对象被慢速双击并且没有首先被选中(即,这两个选择对象然后进入编辑模式)我验证鼠标没有'我非常感动。我使用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更好这个特定主题。
希望有所帮助!
答案 1 :(得分:1)
是的,这是旧帖子,但问题仍存在于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;