怎么判断焦点在哪个text?

jainkai 2017-09-13 05:31:30


如图,有多个TEXT ,用右边的小键盘输入数字,怎么知道当前输的是哪个文本框呢?
起先我想的是:
if 焦点在TEXT1 THEN
xxxx
elseif 焦点在TEXT2
XXXX
end if

但是。。。我默默的发现,当点击右边的数字时(command),焦点是落在这个按钮上了,

于是我陷入了深思。。。
...全文
740 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
PctGL 2017-10-09
  • 打赏
  • 举报
回复
错了... lz 要的是焦点转移前判断控件
PctGL 2017-10-09
  • 打赏
  • 举报
回复
引用 11 楼 impasse 的回复:
.net 有 ActiveControl属性 vb6不知道

  If TypeOf Me.ActiveControl Is TextBox Then
            Dim activeText As TextBox = Me.ActiveControl

            Select Case activeText.Name
                Case "textbox1"

                Case "textbox2"

                Case Else

            End Select

        End If
正解

    Dim txtBox As TextBox
    
    If TypeOf Screen.ActiveControl Is TextBox Then
        Set txtBox = Screen.ActiveControl
        MsgBox "当前活动的textbox是" & txtBox.Name
    End If
王二.麻子 2017-09-25
  • 打赏
  • 举报
回复
text控件具有LostFocus事件。 把左边的text控件做成数组,在LostFocus事件里把丢失焦点的索引号放在全局变量或者模块变量。 要确定是那个text在command控件之前具有焦点,查询全局的索引号。 为完美些,需要在其他(非text,非command)的控件里面把索引号赋值为不可能的值,比如负值,用于确定text是在command之前丢失的焦点
impasse 2017-09-16
  • 打赏
  • 举报
回复
.net 有 ActiveControl属性 vb6不知道

  If TypeOf Me.ActiveControl Is TextBox Then
            Dim activeText As TextBox = Me.ActiveControl

            Select Case activeText.Name
                Case "textbox1"

                Case "textbox2"

                Case Else

            End Select

        End If
jainkai 2017-09-16
  • 打赏
  • 举报
回复
把index数组编号和数字 对起来 WhoGetFocuse.Text = WhoGetFocuse.Text & (Index) 直接等于INDEX
jainkai 2017-09-16
  • 打赏
  • 举报
回复
OK.搞定了,,谢谢大神了

Private Sub Command2_Click(Index As Integer)‘小键盘’
If Not (WhoGetFocuse Is Nothing) Then
    If Index = 10 Then
        WhoGetFocuse.Text = WhoGetFocuse.Text & "."
    Else
        WhoGetFocuse.Text = WhoGetFocuse.Text & (Index + 1)
    End If
    
    WhoGetFocuse.SetFocus 
End If
End Sub

Private Sub Command3_Click()‘删除键’
If Not (WhoGetFocuse Is Nothing) Then
    If Len(WhoGetFocuse.Text) <> 0 Then
        WhoGetFocuse.Text = Left(WhoGetFocuse.Text, Len(WhoGetFocuse.Text) - 1)
    End If
        WhoGetFocuse.SetFocus
End If
End Sub

Private Sub Text1_GotFocus(Index As Integer)文本框
Set WhoGetFocuse = Text1(Index) 
Text1(Index).SelStart = Len(Text1(Index).Text)‘光标始终保持在最右边
end sub

jainkai 2017-09-16
  • 打赏
  • 举报
回复
触摸屏 没有键盘 调用系统软键盘不够方便
脆皮大雪糕 2017-09-14
  • 打赏
  • 举报
回复
不嫌麻烦逐个写版

Option Explicit
Dim WhoGetFocuse As TextBox '定义模块级变量,存储哪个文本框获取了焦点
Private Sub Command1_Click()
    '按钮点击的时候只要模块变量不为空,那么取到谁就往谁那里送文本
    If Not (WhoGetFocuse Is Nothing) Then
        WhoGetFocuse.Text = WhoGetFocuse.Text & "1"
        WhoGetFocuse.SetFocus '完事以后再把焦点交还给文本框
    End If
End Sub
Private Sub Command2_Click()
    '按钮点击的时候只要模块变量不为空,那么取到谁就往谁那里送文本
    If Not (WhoGetFocuse Is Nothing) Then
        WhoGetFocuse.Text = WhoGetFocuse.Text & "2"
        WhoGetFocuse.SetFocus '完事以后再把焦点交还给文本框
    End If
End Sub

Private Sub Text1_GotFocus()
    Set WhoGetFocuse = Text1 '两个文本框谁获得了焦点就把自己塞给前面定义的模块级变量
End Sub

Private Sub Text2_GotFocus()
    Set WhoGetFocuse = Text2
End Sub

用控件数组版:

Option Explicit

Dim WhoGetFocuse As TextBox '定义模块级变量,存储哪个文本框获取了焦点


Private Sub Command1_Click(Index As Integer)
    '按钮点击的时候只要模块变量不为空,那么取到谁就往谁那里送文本
    If Not (WhoGetFocuse Is Nothing) Then
        WhoGetFocuse.Text = WhoGetFocuse.Text & (Index + 1)
        WhoGetFocuse.SetFocus '完事以后再把焦点交还给文本框
    End If
End Sub

Private Sub Text1_GotFocus(Index As Integer)
    Set WhoGetFocuse = Text1(Index) '两个文本框谁获得了焦点就把自己塞给前面定义的模块级变量
End Sub

of123 2017-09-14
  • 打赏
  • 举报
回复
虚拟键盘搞起来比较麻烦。 一,你要用变量记住之前得到焦点的文本框;二,你每次按键输入数字后,还要设置文本框得到焦点。这样你停下来能看到文本框中光标闪烁。 下面的例子中,是按钮按下输入到 Text 的情况。
Dim n As Integer

Private Sub Command1_Click(Index As Integer)
    If Index = 10 Then
        Text1(n) = Replace(Text1(n), ".", "") & "."
    Else
        Text1(n) = Text1(n) & Index
    End If
    Text1(n).SelStart = Len(Text1(n))
    Text1(n).SetFocus
End Sub

Private Sub Command2_Click()
    Text1(n) = Left(Text1(n), Len(Text1(n)) - 1)
    Text1(n).SelStart = Len(Text1(n))
    Text1(n).SetFocus
End Sub

Private Sub Text1_GotFocus(Index As Integer)
    n = Index
End Sub
Text1和 Command1 都是控件数组,其中 Command1(10) 是小数点;Command2 是退格键。
jainkai 2017-09-14
  • 打赏
  • 举报
回复
啊哈,好像真的挺复杂的,1楼的应该也不简单,我想到一个本办法,,4个FRAME 对应4个TEXT,哪个text激活,对应的FRAME显示出来,,,应该是可以实现的,,就是方法太LOW
of123 2017-09-14
  • 打赏
  • 举报
回复
哈哈,搞错了。用的是界面上的虚拟键盘。不能用 2 楼的方法。
of123 2017-09-14
  • 打赏
  • 举报
回复
其实,你可以不用按钮的事件去编码,而是直接在 Text 的 KeyPress 事件中去处理。 如果你用的是 Text 控件数组,事件的参数中有 Index 参数,表明是哪一个成员:
Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
    If Index = 0 Then
        '......
    Else
        '......
    End If
End Sub
如果不是数组,你就在各个 Text 的 KeyPress 事件中处理。
xdz_myfunction 2017-09-14
  • 打赏
  • 举报
回复
问题解决的方法,上面已经讲得比较清楚了。 我就是想问一下楼主,设置数字小键盘输入的目的何在?你的用户没有键盘输入吗?有必要搞这么复杂吗? 当然如果是需要输入某些特定的东西还好理解,至于只输入0123456789就呵呵了。
舉杯邀明月 2017-09-13
  • 打赏
  • 举报
回复
你用鼠标“点右边”的那些按钮时,焦点肯定已经切换了。 要实现输入不同的TextBox,恐怕只有用一个变量“记录”哪个Text最后获得了焦点。 比如变量值1到4,对应你窗口中从上到下的4个TextBox; 程序启动时,要设置“默认的第1个接受输入”的文本框,   并且焦点最好在对应的控件上(设计时把TabIndex设置为0)、并设置相应的变量值(在Form_Load()中赋值); 然后各个TextBox的GotFocus()事件中,改变“记录”变量的值,以及“光标位置”等信息。 这样,在右边的按钮事件中,按变量值来处理相应的TextBox文本内容。 (注意:有很多逻辑方面的细节要处理好才行,要不然会显得“行为怪异”)

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧