回 帖 发 新 帖 刷新版面

主题:[请教] 控件上的LostFocus方法程序有没有控制下一焦点的功能?

编程时通常希望能根据录入的内容,在LostFocus写代码进行判断,确定下一焦点到哪里去。
可每每总是失败,因而觉得LostFocus方法已经无力控制下一焦点了,要到按顺序的下一控件的GotFocus去解决,这样编程很复杂。
请教各位高师:LostFocus方法程序有没有控制下一焦点的功能?如果没有,还有没有更好的补救方法?
致以诚挚的感谢!

回复列表 (共23个回复)

11 楼

种子的意思是如果不经过 key13的话,就不能执行他控制焦点的语句吧?

如果是这个意思的话,种子的意图好象也有点矛盾,因为如果用鼠标去点击一个对象,种子却让另外一个对象得到焦点,这样不会让人觉得焦点乱跑吗?

12 楼

通常情况下:
if nKeyCode=13
  .................
  .................
  .................
  this.Parent.grid2.SetFocus
ENDIF
之间还会有其它工作要做的,不一定只是this.Parent.grid2.SetFocus,例如录入了数量,就要把数量*单价得出的金额写入金额栏吧?这样用鼠标点其它控件结束焦点问题解决了,但其它工作却也没有做。
根据录入内容确定焦点去向是经常发生的事,我编的软件里这种事件很多很多,只是觉得如果不能在LostFocus中解决,而要到下一个控件的GotFocus里去解决,那样编程太麻烦,想找到更好我解决方法。
谢谢各位!

13 楼

在当前正在编辑的对象 keypress 事件写入:(这个对象,不是已自动移动到新对象)
if nKeyCode=13
    NODEFAULT
    this.Parent.text8.SetFocus && 将焦点转移到:你指定的控件对象上。
endif

当前正在编辑的对象,LostFocus 事件中的源代码还保留不改变!

14 楼

[quote]在当前正在编辑的对象 keypress 事件写入:(这个对象,不是已自动移动到新对象)
if nKeyCode=13
    NODEFAULT
    this.Parent.text8.SetFocus && 将焦点转移到:你指定的控件对象上。
endif

当前正在编辑的对象,LostFocus 事件中的源代码还保留不改变!

[/quote]
对大师的提议理解了一部分,觉得能解决一部分问题,还有一部分解决不了,也是我最初提到过的问题。
就是要经过LostFocus 事件中的源代码对录入的内容分析处理后才能确定焦点往哪里去,并非简单的指定只要回车就去this.Parent.text8.SetFocus 。
再次感谢!

15 楼

老种子好,俺觉得你用错事件了。

想要“对录入的内容分析处理后才能如何如何”,这明明是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 楼

Ilikefox老师你好:
    看到你的回帖,真是喜出望外那种感觉。
    因为我知道LostFocus是离开焦点时发生,Valid是离开焦点前发生。
    报着极大的信心进行了测试,结果是“牛郎欲问瘟神事,一样悲欢逐逝波。”
    虽然如此,还是觉得Ilikefox老师想的有道理,Valid还是引起了我的重视,我还要再研究一下。
    十分感谢!

17 楼

呵呵,老种子好。

是否是新建表单测试的?还是直接就用到已有的表单上去了。

新建一个试试。俺是9英文版。

18 楼

[quote]呵呵,老种子好。
是否是新建表单测试的?还是直接就用到已有的表单上去了。
新建一个试试。俺是9英文版。[/quote]
谢谢赵老师关心!
    先说句笑话,也是真话:“我是信以为真了,直接在原软件上改的。”
    涉及到的TEXT共7个,其中包含我原来解决的笨办法,还涉及到一个.PRG文件。
    我是认为准能行了,结果没行又都改回来的。哈哈!
    版本倒是有点差别,俺是9中文版。但愿问题在这里,但愿还能找到解决方法。
    谢谢!

19 楼

在 Valid 事件中,将焦点指向指定的控件:


假如:你当前的控件是: 容器对象.text6 

如果要将焦点指定到, 容器对象.text1
在Valid 事件中写到:
retu -5

如果要将焦点指定到, 容器对象.text10
在Valid 事件中写到:
retu -3

在本级对象不动:
retu 0

20 楼

* 客户_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离开焦点时代码的一小部分,前面是对录入信息的分析整理,从“* -----确定焦点落哪里”往下是确定焦点去向部分。
这段代码是软件中的一段真实代码,并非假设。从“* -----确定焦点落哪里”往下是向大家请教能否简化部分。

我来回复

您尚未登录,请登录后再回复。点此登录或注册