當欄位長度=MaxLength時,我用SendKeys "{TAB}" 將Focus跳到下一控制項,但例如最後一個鍵入字是大寫A , 因鍵盤CapsLock燈沒亮,我按住 Shift 再加上小寫a , Focus不但沒往下跳, 反而往上一欄跳, 是因按住 Shift關係,請問該如何解決,謝謝
直接指定 物件(index).setfocus
謝謝阿戊大大的指引,但我並不一定會知道下一控制項的名稱,請問如何解決?
笨方法:搜尋表單中 tabindex 最接近自己但比較大而可以 setfocus 的控制項。
'***在新表單上丟入text1,text2,text3,command1 '***超過.MaxLength只在textbox中切換駐點 '***保留原{tab}及{s_tab}的功能--- Private Sub Form_Load() Text1.MaxLength = 2: Text1 = "" Text2.MaxLength = 3: Text2 = "" Text3.MaxLength = 4: Text3 = "" Command1.Caption = "不要理我!" End Sub Private Sub Text1_Change() If Len(Text1) >= Text1.MaxLength Then nextobj Text1.TabIndex End Sub Private Sub Text2_Change() If Len(Text2) >= Text2.MaxLength Then nextobj Text2.TabIndex End Sub Private Sub Text3_Change() If Len(Text3) >= Text3.MaxLength Then nextobj Text3.TabIndex End Sub Sub nextobj(ti As Integer) If ti = Controls.Count - 1 Then ti = -1 '判斷從最後一個跳到第一個 For Each i In Controls If i.TabIndex = ti + 1 Then '判斷下一個物件 If TypeOf i Is TextBox Then i.SelStart = 0: i.SelLength = Len(i.Text) '如果是textbox就把文字全選 i.SetFocus: Exit For '取得駐點並跳出迴圈 Exit For Else ti = i.TabIndex '非textbox物件 nextobj ti '遞迴 End If End If Next i End Sub
真的太感謝阿戊大大這麼詳細的範例,終於解決困擾我已久的問題,謝謝您!
個人認為戊兄的範例有諸多缺點: 1.使用耗費資源的遞迴。 2.只能跳到 TextBox,但 CommandButton 明明就是可以用 tab 跳上去的,在此範例卻故意做成不能跳。其他還有很多可以取得輸入焦點的控制項,甚至 UserControl 也可以,用例舉的根本顧不到。 3.沒有考慮到 Disable 與 Invisible 時亦不能取得輸入焦點。 4.若有沒有 TabIndex 的控制項如 Timer 會發生錯誤。 5.文字方塊全選,應該是寫在 Text_GotFocus 或其他方法,而不應寫在「輸入完成自動跳到下一控制項」的函式中。 以下是我重寫的: Sub TabToNextControl(ByVal Index As Integer) Dim NowIndex As Long Dim NowControl As Control NowIndex = Index + 1 ' Index = NowIndex 即繞一圈 While Index <> NowIndex For Each NowControl In Controls ' 有些控制項沒有 TabIndex 屬性,如 Timer,直接找下一個 On Error GoTo NoTabIndex If NowControl.TabIndex = NowIndex Then ' 只要有 SetFocus 函式就算是 Tab 成功,否則就找下一個 On Error GoTo CannotGotFocus NowControl.SetFocus Exit Sub End If NextControl: Next NowControl NextIndex: If NowIndex >= Controls.Count - 1 Then NowIndex = 0 Else NowIndex = NowIndex + 1 End If Wend Exit Sub NoTabIndex: ' Resume 之後才能重新 On Error Resume NextControl CannotGotFocus: ' Resume 之後才能重新 On Error Resume NextIndex End Sub 這個範例因為錯誤處理的關係,看起來有點複雜,還有什麼沒處理到的問題請指教。