Tabbed Dialog Control: movendo-se apenas pelos controles da tab ativa quando se usa a tecla Tab

Embora não seja perfeito, o Tabbed Dialog Control representa uma grande melhora em comparação com o velho controle Tab Strip. Se você não está acostumado com este controle, o Tabbed Dialog, diferentemente do Tab Strip, permite que você deposite controles sobre as tabs. Estas tabs agem como containers dos controles postos sobre elas e automaticamente mostram somente os controles contidos na tab ativa. 

Para a maioria das situações, o Tabbed Dialog se comporta bem, mas se você depositar sobre suas tabs controles OCX não nativos do VB, o Tabbed Dialog começará a se comportar de modo estranho. Quando o usuário teclar Tab para mudar o foco de um controle para outro, a mudança de foco não se limitará aos controles da tab ativa, mas também passeará pelos controles OCX das tabs ocultas.  Isto representa um sério inconveniente do controle. 

Mas, felizmente, há uma solução simples baseada no comportamento não documentado do controle para estas situações. O que aparentemente acontece é que o Tabbed Dialog Control, oculta os controles das tabs não ativas simplesmente movendo-os para além da sua margem esquerda. Desta forma, os controles ocultados terão sempre um valor negativo para a propriedade Left. É possível então criar-se uma rotina genérica e reutilizável que muda para False o valor da propriedade TabStop de todos os controles que estejam com o valor de Left negativo. Esta rotina é chamada no tratamento do evento Click do Tabbed Dialog Control, que ocorre quando se muda a tab ativa.

O procedimento seguinte mostra um exemplo desta solução:

Private Sub PrevineTab()
    Dim ctl As Control
    For Each ctl In Me.Controls
          With ctl
              If TypeOf .Container Is SSTab Then
                  'Nem todos os controles têm a propriedade TabStop
                  On Error Resume Next
                 .TabStop = (.Left > 0)
                  On Error GoTo 0
             End If
         End With
     Next ctl
End Sub

Como você pode ver, este procedimento percorre todos os controles do formulário testando pelos que estão contidos num controle do tipo SSTab (Tabbed Dialog). Ele então ajusta a propriedade TabStop de cada controle para o valor booleano da expressão .Left > 0. Para os controles na parte visível do SSTab, a expressão retornará True, enquanto para os outros, retornará False.