任何人都可以指向任何地方的文章或代码示例如何
在TStringGrid中提供BOTH编辑和范围选择?
是的,我知道有第三方网格可以做到这一点,但确实如此
令人沮丧的是,内置网格缺乏这种基本功能.
背景:
期望能够在网格中编辑单元格是很正常的,
并且还可以选择一系列单元格,例如复制操作.
交付时,TStringGrid不会这样做.它是/或.事实上,
doc告诉我们有关网格选项的信息,“goEditing包含在
选项,goRangeSelect无效“.
但是,看起来可以进行编辑和范围选择
无论如何在TStringGrid!通过仔细使用mousedown,
mouseup,selectcell和exit事件,你可以通过切换得到关闭
在正确的时间打开和关闭元素.但我还是没有
它完美,只包括鼠标使用,而不是键盘更改.
如果是这样,我建议采用以下方法:
组合选择和编辑行为
我发现这是一种很好的,Windows标准行为的方法:
>将网格保留为选择模式,因此鼠标和键盘交互选择单元格
>根据某些标准触发正在编辑的单元格(我认为您正在按照您在上一段中的说法执行此操作.)有一些常用的触发编辑方法,以下标准是我的程序所遵循的当他们做与其他控件类似的事情:
>选择是正常的.即,单击选择,单击并拖动以进行多选,使用键盘箭头和Shift或Control进行选择等.
>单元enters edit mode时:
>选择一个单元格,用户按Enter键或F2键(F2是标准的“重命名”或“编辑”快捷键,可在多个程序中使用)
>用户在单元格上“慢速双击” – 即,在暂停后,在已选择的单元格上慢速双击以选择和编辑,或再次单击.这模仿了资源管理器的行为,如果选择了一个文件并稍后单击它,它将进入内联编辑/重命名模式.要实现此功能,请记录上次单击(并选择)单元格的时间.如果再次单击该单元格,如果时间大于GetDoubleClickTime
,则表示他们已经慢慢点击两次,然后进入编辑模式.这使您可以区分第一次单击以选择,双击(执行某种操作)和慢速第二次单击,以进入编辑模式.
我也倾向于检查鼠标位置,这样如果一个对象慢速双击并且没有首先被选中(即,这两个选择对象然后进入编辑模式)我验证鼠标没有移动许多.我使用GetSystemMetrics
找到双击距离,并检查慢速双击是否在此框内. (因为它不是真正的双击,我实际检查距离时间2.我的动作代码是:
const int iMAX_MOVE_AMOUNT = :: GetSystemMetrics(SM_CYDOUBLECLK)* 2; (对不起,C不是德尔福,但应该可以轻松转换!)
但我实际上不确定这是否完全和完全100%的Windows指南.在实践中,用户发现它的工作正如他们所期望的那样.)
这应该让您在适当的时候用键盘和鼠标在选择和编辑之间进行切换.
杂想
通过继承TStringGrid并创建新组件,您可能会发现其中一些更简洁,更容易实现.这将允许您在普通代码中实现它并覆盖内置行为(而不是事件处理程序),同时使其对表单代码不可见.它还将为您提供对鼠标事件或Windows消息的低级访问,而不仅仅是通过OnMouseDown等事件公开.最后,如果在选项中包含goEditing时显示编辑器时出现问题,这将允许您更改该行为.如果您希望代码响应某些事情,例如创建OnBeginEdit事件,您也可以添加自己的事件.
创建自己的组件通常被认为是一个高级Delphi主题,但一旦你知道如何,它实际上非常容易! This site有一些很好的主题,一般会向你介绍这个主题,如果你走这条路并遇到问题,Stack Overflow当然是一个提问的好地方:) Embarcadero Delphi » VCL » Writing Components新闻组/论坛也是一个很好的资源事实上,对于这一特定主题,甚至可能比SO更好.
希望有所帮助!