Acabaria sendo muito trabalho pra pouca coisa, ou pra facilitar problemas.
Acabo usando uma forma mais simples de fazer isso.
Algo como;
DO WHILE .T.
DO CASE
CASE nTab == 1; Gets da tab1
CASE nTab == 2; Gets da tab2
CASE nTab == 3; Gets da tab3
OTHERWISE; EXIT
ENDCASE
IF ! lDigita
CLEAR GETS
EXIT
ENDIF
READ
nTab := iif( LastKey() == K_UP, Max( 1, nTab - 1 ), nTab + 1 )
ENDDO