我有同样的问题,但更简单的解决方案,因为我强制用户按 Enter 键...
诀窍:我不允许用户在编辑一个单元格时更改到另一个单元格,所以我强制用户必须按 Intro/Enter 键结束编辑,然后我允许更改到另一个单元格.
不好的部分是 OnKeyPress 发生在 OnSetEditText 之前,所以我尝试使用 OnKeyUp...
我发现,就在编辑单元格时,按下 Enter/Intro 后,OnKeyUp 没有被触发……这是 VCL 上的一个 BUG……一个键已被释放,而 OnKeyUp 没有被触发。
所以,我做了另一个技巧来绕过它......使用计时器来改变我会做的事情,所以我让时间来触发 OnSetEditText 之前的事件。
让我解释一下我为成功所做的一切......
我已经通过在 OnSelectCell 上放置代码来锁定选择另一个单元格,与此非常相似:
CanSelect:=Not UserIsEditingOneCell;
在 OnSetEditText 上我写了这样的代码:
UserIsEditingOneCell:=True;
所以现在,需要检测用户何时按下 Enter/Intro ......我发现了一件可怕的事情,正如我所说...... OnKeyUp 不会为这样的键触发......所以,我将模拟那个通过使用 Timer 并使用 OnKeyPress,因为 OnKeyPress 被触发,但 OnKeyUp 没有,对于 Enter 键...
所以,在 OnKeyPress 上我输入了类似的内容:
TheTimerThatIndicatesUserHasPressEnter.Interval:=1; // As soon as posible
TheTimerThatIndicatesUserHasPressEnter.Enabled:=True; // But after event OnSetEditText is fired, so not jsut now, let some time pass
这样的计时器事件:
UserIsEditingOneCell:=False;
// Do whatever needed just after the user has finished editing a cell
这行得通,但我知道这很可怕,因为我需要使用计时器......但我不知道更好的方法......而且因为我不需要让用户去另一个单元格,而那个是edinting 没有有效值...我可以使用它。
为什么没有像 OnEndingEditing 这样的事件?
PD:我还注意到 OnSetEditText 会为每个被按下的键触发多次,并且在 Value 参数上具有不同的值...至少在使用 OnGetEditMask 事件上设置的 EditMask 值“00:00:00”时。