注册 登录
编程论坛 VFP论坛

请教一个关天text文本框keypress响应的问题

农民帅哥 发布于 2022-12-15 10:36, 2189 次点击
LPARAMETERS nKeyCode, nShiftAltCtrl

IF  nkeycode=13
 REPLACE 成本 WITH 单价1*用量1+单价2*用量2+单价3*用量3+单价4*用量4+单价5*用量5
ENDIF
thisform.text27.Refresh

代码如上,本意是想当text里的数值变化并回车后将变化后的数据刷新,现在这样输入新数据后按回车直接跳到下一个编辑项,只有在编辑框直接回车代码才会响应,请将版主及各位高手们如何解决?谢谢
22 回复
#2
吹水佬2022-12-15 10:49
IF  nkeycode=13
    ? "nkeycode=13"
ENDIF
先这样测试能否正常触发
#3
农民帅哥2022-12-15 11:13
回复 2楼 吹水佬
好的,谢谢,先试试
#4
农民帅哥2022-12-15 11:48
回复 2楼 吹水佬
找到原因了,按键响应了
我认为回车后
if nkeycode=13
后面的代码没有执行是因为回车后光标已经移到下一个文本框了,执行的是下一个文本框的代码
这个时候如何才能解决回车后执行完本文本框代码?

[此贴子已经被作者于2022-12-15 12:56编辑过]

#5
吹水佬2022-12-15 13:00
回复 4楼 农民帅哥
事件响应时就是执行事件的代码,怎会有响应而无执行。
#6
农民帅哥2022-12-15 15:05
回复 5楼 吹水佬
我加了‘?nkeycode’代码,每个按键都有显示反应
刚才检查了一下数据表里面的数据执行情况,在按键过程中,编辑的字段‘用量’数据也改变了,但是 ‘repl 成本 with 单价*用量’没有执行

 ?nkeycode
REPLACE  成本价 WITH 单价1*用量1+单价2*用量2+单价3*用量3+单价4*用量4+单价5*用量5
 thisform.text29.Refresh

上面代码 ?nkeycode 每次都能执行,但后面的‘repl .......’没有执行出正确结果,如果再次对这个text时行编辑,一按键代码就执行正确结果了
#7
吹水佬2022-12-15 16:08
回复 6楼 农民帅哥
执行后没有正确的结果,是被执行语句的问题,或者是语句表达式的问题。
执行了是肯定的,检查一下语句,语句可以先简单点,或者先查看一下相关变量。确认后运算结果是怎样不是就清楚了吗
#8
吹水佬2022-12-15 16:11
IF  nkeycode=13
    ? 单价1,用量1,单价2,用量2,单价3,用量3,单价4,用量4,单价5,用量5
ENDIF
就这样看看先
估计是工作区问题
#9
吹水佬2022-12-15 16:13
或者这样试试:REPLACE 语句加 “IN 工作区别名”
REPLACE 成本 WITH 单价1*用量1+单价2*用量2+单价3*用量3+单价4*用量4+单价5*用量5 IN <工作区别名>
#10
吹水佬2022-12-15 16:15
thisform.text29.Refresh 这句应该不用,其实无需一变动就要 Refresh
#11
农民帅哥2022-12-15 17:38
回复 10楼 吹水佬
谢谢,谢谢
这个思路学到了,一步步来
#12
农民帅哥2022-12-15 17:51
回复 10楼 吹水佬
老大再请教一下,按您的方法

? 用量1

回车后这个值显示没有变化,和输入的值不一样,但这个时候打开关联的表和这个text所对应的字段值却已经改变了的,这是为啥啊?
#13
sam_jiang2022-12-15 19:14
text控件的keypress事件需要先屏蔽一下吧?
nodefault
等执行完你自己的代码后再执行默认代码。
dodefault()
#14
吹水佬2022-12-15 19:58
以下是引用农民帅哥在2022-12-15 17:51:00的发言:

老大再请教一下,按您的方法

? 用量1

回车后这个值显示没有变化,和输入的值不一样,但这个时候打开关联的表和这个text所对应的字段值却已经改变了的,这是为啥啊?

textbox触发keypress事件,这时是输入过程的一个“中断”,输入还没有完成的,就不会更新绑定的数据源。
既然是回车后处理数据,倒不如在textbox的LostFocus事件中处理。甚至可以不用绑定数据源,在数据编辑完成确认后统一更新数据源。
#15
农民帅哥2022-12-15 20:24
回复 13楼 sam_jiang
谢谢大侠,加进去回车没用了请教应该怎么用,谢谢
#16
csyx2022-12-15 23:20
14楼已经说的很清楚了,keypress事件发生在焦点切换之前,textbox未丢失焦点之前是不会更新所绑定的【变量/字段】值的
所以,replace 中的【变量1】没有变,你应该把 变量1 换成 this.value

但这仍是错误的设计,用户不光会用 enter,还有很多其他方法结束这个文本框的输入:
1. 值被填满时,例如:变量1 是 N(4,2) 用户录入 1.23 后
2. 可以按 enter,也可以用 tab 键
3. 可以按快捷键 alt+?直接跳到其他控件(如果有的话)
4. 可以鼠标点其他允许操作的控件

所以,replace ... 应该放在 LostFocus 事件中,根本不需要判断按了什么键


[此贴子已经被作者于2022-12-15 23:24编辑过]

#17
sam_jiang2022-12-16 15:59
回复 15楼 农民帅哥
dodefault()用了吗?
#18
农民帅哥2022-12-16 20:42
回复 16楼 csyx
谢谢,马上试试
#19
农民帅哥2022-12-16 20:42
回复 17楼 sam_jiang
用了
#20
农民帅哥2022-12-16 20:44
回复 16楼 csyx
谢谢,一句话点醒我这个菜鸟
#21
sam_jiang2022-12-17 12:21
回复 17楼 sam_jiang
那就在dodefault()后面再发个模拟enter键!
#22
cssnet2022-12-17 13:16
感觉上,大伙儿好像有些“钻牛角尖”了。
既然已经分析得非常清楚啦——
当VFP在处理文本框的键盘按键事件时,来不及立刻更新文本框的数据源。
那么,最简单的解决方法可能是:
让键盘按键事件正常结束,接着,让vfp按步就班地更新好数据源,最后,再取得这个VFP已更新好之后的最新数据。
那无非就加个TimerX控件,时间间隔设为500,初始化时,enabled = .F.
当KeyPress事件拦截到“回车键”之后,就设TimerX.enabled = .T.,然后,正常结束这个KeyPress事件代码过程。
(接下来,让VFP傻乎乎地、按步就班地、有条不紊地更新好数据源……)
这样又默默地经过了500毫秒。上帝保佑,但愿VFP已准备好了最新数据源。
在TimerX的Timer事件代码中,插入所需的处理代码,最后,设置Timer3.enabled = .F.
#23
农民帅哥2022-12-17 15:46
感谢热情的大伙,这个问题我觉得最合适的正解是14楼吹水佬版主和16楼的朋友csyx的方法,简单明白,结果立杆见影
1