注册 登录
编程论坛 VFP论坛

关于焦点返回文本框的问题

yuantao100 发布于 2020-07-24 19:35, 4540 次点击
我的表单里面有一个文本框text1,主要平时用来扫条码。

我想让操作员不管在表单上点选了啥,焦点都回到这个文本框,所以在lostfocus里写了this.setfocus。

后来界面上多了一些工作,我想让这个文本框失去焦点的时候,去处理command1的click,
就把lostfocus里改成了,并在command1的click最后写了thisform.text1.setfocus,
但是焦点却不会回到这个text1里面了。。。但是直接点command1焦点是可以回来的。。。

不知道我说明白没?这个有办法解决没?

35 回复
#2
吹水佬2020-07-24 20:56
text1的lostfocus里调用完了还会回到lostfocus里最后离开text1
#3
吹水佬2020-07-24 21:01
在lostfocus里写了this.setfocus,会离不开text1

[此贴子已经被作者于2020-7-24 21:08编辑过]

#4
瓜瓜19902020-07-24 22:41
在text控件的lostfocus事件里写this.setfocus,焦点仍会离开
在valid事件里输入return 0,可以不让焦点离开.
#5
zhken2020-07-24 23:04
看一下tab顺序,可以将text1和command设为相邻的顺序,command顺序为后,如有必要,在command的getfocus写上thisform.text1.setsocus确保万无一失
#6
mywisdom882020-07-24 23:37
以下是引用瓜瓜1990在2020-7-24 22:41:35的发言:

在text控件的lostfocus事件里写this.setfocus,焦点仍会离开
在valid事件里输入return 0,可以不让焦点离开.

但是,却无法关闭这个表单了。
#7
yuantao1002020-07-25 08:34
以下是引用吹水佬在2020-7-24 21:01:00的发言:

在lostfocus里写了this.setfocus,会离不开text1


不会啊,我的在别的表单里面点一下就离开了。。
但是点命令窗口就离不开text1,焦点还会回text1
#8
yuantao1002020-07-25 08:36
以下是引用吹水佬在2020-7-24 20:56:14的发言:

text1的lostfocus里调用完了还会回到lostfocus里最后离开text1

老大,那有解决办法吗?
我想text1在失去焦点时执行完,然后焦点还回到text1....
因为这个text1在接收条码,在条码枪扫描条码处理完后,还接着扫下一下,
不然每次就要鼠标点一下
#9
yuantao1002020-07-25 08:38
以下是引用瓜瓜1990在2020-7-24 22:41:35的发言:

在text控件的lostfocus事件里写this.setfocus,焦点仍会离开
在valid事件里输入return 0,可以不让焦点离开.

我主要是想让程序处理完必要的操作后,再回到text1
#10
yuantao1002020-07-25 08:39
以下是引用zhken在2020-7-24 23:04:10的发言:

看一下tab顺序,可以将text1和command设为相邻的顺序,command顺序为后,如有必要,在command的getfocus写上thisform.text1.setsocus确保万无一失

试了下,貌似不行啊。。。
#11
吹水佬2020-07-25 09:05
在lostfocus里处理完事务后发个异步消息,在消息处理过程执行text1.setfocus应该可以
#12
yuantao1002020-07-25 10:52
以下是引用吹水佬在2020-7-25 09:05:14的发言:

在lostfocus里处理完事务后发个异步消息,在消息处理过程执行text1.setfocus应该可以

好的,那我试试。。
#13
瓜瓜19902020-07-25 15:59
回复 6楼 mywisdom88
valid事件里根据鼠标点击的位置判断
IF MROW(thisform.Name,3)#-1 and Mcol(thisform.Name,3)#-1
    RETURN 0
endif
但是表单重新激活时,如果直接点其他可以获得焦点的控件,text就可能失去焦点.
#14
吹水佬2020-07-25 16:14
DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG
#DEFINE MY_MSG  0x401
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 as Form
    ADD OBJECT text1 as textbox WITH left=10,top=10,SelectOnEntry=1
    ADD OBJECT text2 as textbox WITH left=10,top=40
    PROCEDURE init
        BINDEVENT(this.hWnd, MY_MSG, this, "myMsg")
    ENDPROC
    PROCEDURE myMsg(hWnd, uMsg, wParam, lParam)
        this.text1.setfocus
    ENDPROC
    PROCEDURE text1.lostfocus
        thisform.text2.value = thisform.text1.value
        PostMessage(thisform.hWnd, MY_MSG, 0, 0)
    ENDPROC
ENDDEFINE
#15
yuantao1002020-07-25 18:26
以下是引用吹水佬在2020-7-25 16:14:05的发言:

DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG
#DEFINE MY_MSG  0x401
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 as Form
    ADD OBJECT text1 as textbox WITH left=10,top=10,SelectOnEntry=1
    ADD OBJECT text2 as textbox WITH left=10,top=40
    PROCEDURE init
        BINDEVENT(this.hWnd, MY_MSG, this, "myMsg")
    ENDPROC
    PROCEDURE myMsg(hWnd, uMsg, wParam, lParam)
        this.text1.setfocus
    ENDPROC
    PROCEDURE text1.lostfocus
        thisform.text2.value = thisform.text1.value
        PostMessage(thisform.hWnd, MY_MSG, 0, 0)
    ENDPROC
ENDDEFINE



呃,大佬,我再问个题外的问题,我用modi form做的表单,有没有办法把它变成像您这样的PRG程序?
#16
sdta2020-07-25 18:30
类浏览器中转换

[此贴子已经被作者于2020-7-25 18:32编辑过]

#17
yuantao1002020-07-25 18:57
我去试试
#18
吹水佬2020-07-25 19:52
回复 15楼 yuantao100
静态设计form一样
在表单设计器自定义方法myMsg(菜单--表单--新建方法程序)
#19
yuantao1002020-07-25 20:03
以下是引用吹水佬在2020-7-25 19:52:29的发言:

静态设计form一样
在表单设计器自定义方法myMsg(菜单--表单--新建方法程序)


OK! 谢过大侠!!
#20
mywisdom882020-07-25 23:43
回复 14楼 吹水佬
* 改为下面,将有其他问题
* 测试时,先不要在Text1输入数据,在Text2或者Text3中输入数据,然后再回来Text1输入数据
* 我的测试结果,Text2,Text3会看不见了.
DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG
#DEFINE MY_MSG  0x401
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 as Form
    ADD OBJECT text1 as textbox WITH left=10,top=10,SelectOnEntry=1
    ADD OBJECT text2 as textbox WITH left=10,top=40
    ADD OBJECT text2 as textbox WITH left=10,top=70 &&增加1个
    PROCEDURE init
        BINDEVENT(this.hWnd, MY_MSG, this, "myMsg")
    ENDPROC
    PROCEDURE myMsg(hWnd, uMsg, wParam, lParam)
        this.text1.setfocus
    ENDPROC
    PROCEDURE text1.lostfocus
*       thisform.text2.value = thisform.text1.value
        PostMessage(thisform.hWnd, MY_MSG, 0, 0)
    ENDPROC
ENDDEFINE
#21
mywisdom882020-07-25 23:48
* 改为这样,就正常,也就是把Text2隐藏起来,不需要
* 我为什么会这样测试呢,因为很多情况,界面上可能是不需要Text2的
DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG
#DEFINE MY_MSG  0x401
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 as Form
    ADD OBJECT text1 as textbox WITH left=10,top=10,SelectOnEntry=1
    ADD OBJECT text2 as textbox WITH left=10,top=40,Visible =.f.
    ADD OBJECT text3 as textbox WITH left=10,top=70
    PROCEDURE init
        BINDEVENT(this.hWnd, MY_MSG, this, "myMsg")
    ENDPROC
    PROCEDURE myMsg(hWnd, uMsg, wParam, lParam)
        this.text1.setfocus
    ENDPROC
    PROCEDURE text1.lostfocus
        thisform.text2.value = thisform.text1.value
        PostMessage(thisform.hWnd, MY_MSG, 0, 0)
    ENDPROC
ENDDEFINE
#22
吹水佬2020-07-26 04:31
回复 20楼 mywisdom88
text2是代表text1在lostfocus中要处理的事情,作示例用
实际情况如楼主的调用按钮点击过程
#23
yuantao1002020-07-26 13:04
以下是引用sdta在2020-7-25 18:30:55的发言:

类浏览器中转换


奇怪,表单运行是好的,可我用类浏览器转换出来的代码,运行的时候说语法错误 。。。
就是这句:
    ADD OBJECT yxwhqx.pageframe1.page1.bb100 AS checkbox WITH ;
        Top = 22, ;
        Left = 23, ;
        Height = 16, ;
        Width = 93, ;
        AutoSize = .T., ;
        Caption = "药品标签打印", ;
        Name = "bb100
#24
sdta2020-07-26 14:29
回复 23楼 yuantao100
yxwhqx?
#25
yuantao1002020-07-26 15:11
以下是引用sdta在2020-7-26 14:29:10的发言:

yxwhqx?

嗯,我给表单起的名字。。。

上面有:DEFINE CLASS yxwhqx AS form
#26
sdta2020-07-26 16:05
看下命令的语法使用,我不喜欢将表单转换为PRG

ADD OBJECT [PROTECTED] ObjectName AS ClassName2
#27
mywisdom882020-07-27 00:10
回复 22楼 吹水佬
PROCEDURE text1.lostfocus
**      thisform.text2.value = thisform.text1.value
        PostMessage(thisform.hWnd, MY_MSG, 0, 0)
 ENDPROC

为什么去掉这,就不行的呢
#28
吹水佬2020-07-27 07:55
回复 27楼 mywisdom88
我这测试正常
与text2都相关的都去掉也未见异常
#29
mywisdom882020-07-27 08:45
PROCEDURE text1.lostfocus
        PostMessage(thisform.hWnd, MY_MSG, 0, 0)
ENDPROC
我测试,只这样,就是不行。
测试时,在text1不要输入任何数据,直接跑到text2去了。
#30
吹水佬2020-07-27 09:15
回复 29楼 mywisdom88
text1无键盘输入时确实如此,同时发现异步消息对控件的刷新重绘有异常
这样试试
        thisform.text1.Refresh
        PostMessage(thisform.hWnd, MY_MSG, 0, 0)
#31
吹水佬2020-07-27 09:25
好象这样也可以:
        thisform.text1.setfocus
        PostMessage(thisform.hWnd, MY_MSG, 0, 0)
#32
吹水佬2020-07-27 14:23
原来 NODEFAULT 就OK,不用异步消息:
    PROCEDURE text1.lostfocus
        NODEFAULT
        this.setfocus
    ENDPROC
#33
yuantao1002020-07-27 18:25

我实现搞不定,把整个这一段程序都重新写了,
让这个扫条码的text1单另做一个表单跳出来,用lostfocus去处理。。。
不用那个按钮了,也不让操作员按按钮了。。。
#34
星光悠蓝2020-07-28 15:00
为什么非要将焦点回到TEXT1,扫描枪接收到数据进行相关处理后,把数据显示在TEXT1就行了。
#35
yuantao1002020-07-28 15:20
以下是引用星光悠蓝在2020-7-28 15:00:19的发言:

为什么非要将焦点回到TEXT1,扫描枪接收到数据进行相关处理后,把数据显示在TEXT1就行了。

不然啊,扫完一个条码处理完以后,需要待命扫下一个条码,不然每次都要用鼠标去点一下。
#36
星光悠蓝2020-07-29 10:07
回复 35楼 yuantao100
我用MSCOMM控件处理接收数据,每次扫描后,焦点都一样,也可又手工输入。
1