首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳转帧间的Taborder

跳转帧间的Taborder
EN

Stack Overflow用户
提问于 2017-08-29 19:33:39
回答 1查看 820关注 0票数 0

我有一个用户表单包含3个框架,所有包括几个文本框。我希望能够标签的文本框跨框架。

如下所示: Frame1 - Textbox1 > Frame2- Textbox1 > Frame3 - Textbox1 > Frame1 - Textbox2 > Frame1 - Textbox3 > Frame2 - Textbox2

文本框是根据所需的taborder动态添加并存储在数组中的,因此可以轻松地访问所需的顺序。我似乎找不到一种方法来应用它。

当然,也可以更改框架布局。但是,框架既用于控制文本框的放置,也用于在文本框的数量超过框架区域时添加单独的滚动条。

这样的事情有可能发生吗?非常感谢您的帮助或建议。

编辑:添加3帧Frames的图片

Edit2:我认为目的地数据评论让我走上了正确的道路。

我创建了一个类模块

代码语言:javascript
复制
Public WithEvents TxtBox1 As MSForms.TextBox

Private Sub TxtBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
   MsgBox ("Test")
End Sub

Private Sub TxtBox1_change()
   MsgBox ("Test")
End Sub

然后在生成文本框的sub中,对于我想要跳转帧的文本框,我这样做:

代码语言:javascript
复制
Dim tabArray1() As New TabBox1
Dim inputfelt As MSForms.TextBox

Set inputfelt = Hovedvindu.SkjemaFrame.SenderFrame.Controls.Add("Forms.TextBox.1", "M" & i & "SenderNavn", True)
Set tabArray1(i).TxtBox1 = inputfelt

这会将所有正确的文本框添加到数组中,以便我可以创建一个更改焦点的退出事件,我认为这不会太困难。然而,我似乎不能正确地触发事件。当我使用sub更改文本框时,change事件似乎会起作用,例如,当我通过循环和更改数组中的文本框的文本来测试正确的文本框添加到数组时。但是当我手动更改文本框时,什么也没有发生。退出事件似乎根本不起作用。

我没有太多的事件处理经验,所以我可能遗漏了一些东西。

EN

回答 1

Stack Overflow用户

发布于 2017-08-30 22:04:56

我找到了一个可以接受的解决方案。一旦我将TabArray()的定义移到sub之外,原始帖子的编辑2中描述的方法就起作用了,这样我就可以在sub结束后跟踪文本框。

我有一个数组和一个类模块,分别用于3个框架中的"end“文本框。类模块跟踪Tab上的keydown。这3个类模块是相同的,除了它们将文本框的tabindex存储在用户表单上的3个不同的隐藏标签中。跟踪tabindex可以让我知道当焦点返回到框架时从哪里开始。

这3个类模块如下所示:

代码语言:javascript
复制
Public WithEvents TxtBox1 As MSForms.TextBox

Private Sub TxtBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal 
Shift As Integer)
   If KeyCode = vbKeyTab Then
      'store tabindex
      Hovedvindu.Controls("SisteTab1").Caption = 
      Hovedvindu.SkjemaFrame.SenderFrame.ActiveControl.TabIndex
      'call sub that moves the focus
      flyttfokus (1)
   End If
End Sub

移动焦点的sub如下所示。输入只是一个整数(1,2或3),这取决于调用来自哪个类模块,以及要从哪个帧移动到哪个帧。sub读取3个隐藏标签,以了解当焦点移动到新框架时从哪个文本框开始。最后一种情况下的错误处理是针对焦点从3d帧中的最后一个文本框移动时进行的。这将尝试将焦点移到第一个框架中不存在的文本框中,这将抛出一个可以忽略的错误。

代码语言:javascript
复制
Sub flyttfokus(SisteFrame As Integer)
    Dim St1 As Integer
    Dim St2 As Integer
    Dim St3 As Integer
    St1 = CInt(Hovedvindu.Controls("SisteTab1").Caption)
    St2 = CInt(Hovedvindu.Controls("SisteTab2").Caption)
    St3 = CInt(Hovedvindu.Controls("SisteTab3").Caption)

    Select Case SisteFrame
        Case 1
            Hovedvindu.SkjemaFrame.MottakerFrame.Controls(St2 + 1).SetFocus
        Case 2
            Hovedvindu.SkjemaFrame.InfoFrame.Controls(St3 + 1).SetFocus
        Case 3
            On Error Resume Next
            Hovedvindu.SkjemaFrame.SenderFrame.Controls(St1 + 1).SetFocus
            On Error GoTo 0
    End Select

   End Sub

当从第一个文本框开始时,此解决方案将按预期工作。但是,如果用户鼠标单击到文本框,例如第二行,然后开始制表符,当焦点在框架之间移动时,焦点将移回第一行。这是因为当框架获得焦点时,用于跟踪Tabindex的变量(标签)仅在用户在工作表中使用tabs键时才会更新。根据程序生成的文本框的数量,在鼠标单击时将这些变量更新为文本框可能是可能的。就我的目的而言,这是没有必要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45938069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档