主题:[请教] 控件上的LostFocus方法程序有没有控制下一焦点的功能?
北京惬意
[专家分:1330] 发布于 2009-11-10 16:48:00
编程时通常希望能根据录入的内容,在LostFocus写代码进行判断,确定下一焦点到哪里去。
可每每总是失败,因而觉得LostFocus方法已经无力控制下一焦点了,要到按顺序的下一控件的GotFocus去解决,这样编程很复杂。
请教各位高师:LostFocus方法程序有没有控制下一焦点的功能?如果没有,还有没有更好的补救方法?
致以诚挚的感谢!
最后更新于:2009-11-10 16:54:00
回复列表 (共23个回复)
11 楼
琅拿度 [专家分:2820] 发布于 2009-11-10 20:11:00
种子的意思是如果不经过 key13的话,就不能执行他控制焦点的语句吧?
如果是这个意思的话,种子的意图好象也有点矛盾,因为如果用鼠标去点击一个对象,种子却让另外一个对象得到焦点,这样不会让人觉得焦点乱跑吗?
12 楼
北京惬意 [专家分:1330] 发布于 2009-11-10 21:50:00
通常情况下:
if nKeyCode=13
.................
.................
.................
this.Parent.grid2.SetFocus
ENDIF
之间还会有其它工作要做的,不一定只是this.Parent.grid2.SetFocus,例如录入了数量,就要把数量*单价得出的金额写入金额栏吧?这样用鼠标点其它控件结束焦点问题解决了,但其它工作却也没有做。
根据录入内容确定焦点去向是经常发生的事,我编的软件里这种事件很多很多,只是觉得如果不能在LostFocus中解决,而要到下一个控件的GotFocus里去解决,那样编程太麻烦,想找到更好我解决方法。
谢谢各位!
13 楼
cbl518 [专家分:57140] 发布于 2009-11-10 22:45:00
在当前正在编辑的对象 keypress 事件写入:(这个对象,不是已自动移动到新对象)
if nKeyCode=13
NODEFAULT
this.Parent.text8.SetFocus && 将焦点转移到:你指定的控件对象上。
endif
当前正在编辑的对象,LostFocus 事件中的源代码还保留不改变!
14 楼
北京惬意 [专家分:1330] 发布于 2009-11-10 23:09:00
[quote]在当前正在编辑的对象 keypress 事件写入:(这个对象,不是已自动移动到新对象)
if nKeyCode=13
NODEFAULT
this.Parent.text8.SetFocus && 将焦点转移到:你指定的控件对象上。
endif
当前正在编辑的对象,LostFocus 事件中的源代码还保留不改变!
[/quote]
对大师的提议理解了一部分,觉得能解决一部分问题,还有一部分解决不了,也是我最初提到过的问题。
就是要经过LostFocus 事件中的源代码对录入的内容分析处理后才能确定焦点往哪里去,并非简单的指定只要回车就去this.Parent.text8.SetFocus 。
再次感谢!
15 楼
Ilikefox [专家分:5770] 发布于 2009-11-10 23:22:00
老种子好,俺觉得你用错事件了。
想要“对录入的内容分析处理后才能如何如何”,这明明是Valid事件过程干的事情啊!
举个例子:
form1上3个文本框text1、text2、text3,要求:
(1)text1输入内容如果是"A",不管按回车还是用户鼠标乱点其它控件,都是text2得到焦点;
(2)text1输入内容如果是"B",不管按回车还是用户鼠标乱点其它控件,都是text3得到焦点;
好办,text1的Valid事件:
IF this.Value="A"
RETURN thisform.text2
ENDIF
IF this.Value="B"
RETURN thisform.text3
ENDIF
老种子试试看,呵呵。
16 楼
北京惬意 [专家分:1330] 发布于 2009-11-11 00:17:00
Ilikefox老师你好:
看到你的回帖,真是喜出望外那种感觉。
因为我知道LostFocus是离开焦点时发生,Valid是离开焦点前发生。
报着极大的信心进行了测试,结果是“牛郎欲问瘟神事,一样悲欢逐逝波。”
虽然如此,还是觉得Ilikefox老师想的有道理,Valid还是引起了我的重视,我还要再研究一下。
十分感谢!
17 楼
Ilikefox [专家分:5770] 发布于 2009-11-11 00:33:00
呵呵,老种子好。
是否是新建表单测试的?还是直接就用到已有的表单上去了。
新建一个试试。俺是9英文版。
18 楼
北京惬意 [专家分:1330] 发布于 2009-11-11 04:46:00
[quote]呵呵,老种子好。
是否是新建表单测试的?还是直接就用到已有的表单上去了。
新建一个试试。俺是9英文版。[/quote]
谢谢赵老师关心!
先说句笑话,也是真话:“我是信以为真了,直接在原软件上改的。”
涉及到的TEXT共7个,其中包含我原来解决的笨办法,还涉及到一个.PRG文件。
我是认为准能行了,结果没行又都改回来的。哈哈!
版本倒是有点差别,俺是9中文版。但愿问题在这里,但愿还能找到解决方法。
谢谢!
19 楼
cbl518 [专家分:57140] 发布于 2009-11-11 08:21:00
在 Valid 事件中,将焦点指向指定的控件:
假如:你当前的控件是: 容器对象.text6
如果要将焦点指定到, 容器对象.text1
在Valid 事件中写到:
retu -5
如果要将焦点指定到, 容器对象.text10
在Valid 事件中写到:
retu -3
在本级对象不动:
retu 0
20 楼
北京惬意 [专家分:1330] 发布于 2009-11-11 11:34:00
* 客户_09查询只有1条.prg
PARAMETERS NN
* -----查询数组赋值
DMB5_1条JL(1)=IIF(JJJ=1 AND NN=0,DM_1,LLLL) &&县
IF JJJ>1
DMB5_1条JL(2)=IIF(JJJ=2 AND NN=0,DM_1,XXXX) &&乡
IF JJJ>2
DMB5_1条JL(3)=IIF(JJJ=3 AND NN=0,DM_1,CCCC) &&村
IF JJJ>3
DMB5_1条JL(4)=IIF(JJJ=4 AND NN=0,DM_1,SSSS) &&社
IF JJJ>4
DMB5_1条JL(5)=DM_1 &&姓名
ENDIF
ENDIF
ENDIF
ENDIF
* -----查表1当前项
SELECT DMZB
GO BOTT
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID1.REFRESH
LOCATE FOR DMB5_1条JL(1)=DM_1
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID1.REFRESH
* -----摘2-5表数据源
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID5.RECORDSOURCE=""
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID4.RECORDSOURCE=""
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID3.RECORDSOURCE=""
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID2.RECORDSOURCE=""
* -----挂数据源 查当前项
J1J1J=JJJ+1
FOR II=2 TO 5
BH=STR(II,1)
IF J1J1J>=II
SELECT (客户分类5表名(II))
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID&BH..RECORDSOURCE="BM_"+BH
GO TOP
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID&BH..REFRESH
IF J1J1J>II
LOCATE FOR DMB5_1条JL(II)=DM_1
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID&BH..REFRESH
ENDIF
ELSE
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID&BH..RECORDSOURCE=""
ENDIF
NEXT II
* -----写凭证
PZBDJ.PZBD.PZB.TEXT10.VALUE=IIF(JJJ=5,BM_5.DM_2,"") &&电话
PZBDJ.PZBD.PZB.TEXT9.VALUE="" &&清往来2窗口
PZBDJ.PZBD.PZB.TEXT8.VALUE=""
I1I=JJJ &&显示简码
DO TEXT8_显示简码 IN 客户_09清7个TEXT
传来的表号_A=JJJ
DO 写清凭证表上对应5项 IN 客户_5表_A_号不等
是否修改过凭证=.T.
* -----确定焦点落哪里
* .....前4表
DO CASE
CASE JJJ<5
JJJ=JJJ+1
* .....尾部加空行 找下一表尾
DO 客户_尾部加空行 WITH JJJ
SELECT (客户分类5表名(JJJ))
GO BOTTOM
BH=STR(JJJ,1)
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID&BH..REFRESH
PZBDJ.PZBD2.PAGEFRAME1.PAGE3.XDMK1.GRID&BH..SETFOCUS
* .....选项表调用时
CASE NN=1
PZBDJ.PZBD.PZB.GRID1.COLUMN2.SETFOCUS
* .....只有一项时
OTHE
查客户表5用=.T.
ENDCASE
********************************************************************************
上面是在LostFocus离开焦点时代码的一小部分,前面是对录入信息的分析整理,从“* -----确定焦点落哪里”往下是确定焦点去向部分。
这段代码是软件中的一段真实代码,并非假设。从“* -----确定焦点落哪里”往下是向大家请教能否简化部分。
我来回复