Ejemplos en Visual Basic

Algunas indicaciones de cómo usar el control TabStrip

 

Fecha: 03/Mar/1998
Actualizado el 06/Oct/2002
Link al índice de controles especiales de Visual Basic


Este control que sólo está disponible en las versiones de 32 bits del VB, talvez no sea demasiado usado porque no es demasiado fácil, o al menos no es tan simple de usar como su gemelo (o casi) SSTab; éste último no lo suelo usar, no sólo porque haya "oido" que da problemas, sino porque no me gustaba mucho eso de usar los controles del Threed.ocx...
Ya se que es uno de los más usados, por sus paneles y botones y etiquetas 3D, pero que quieres que te diga, no terminó de convencerme...
La verdad es que, cuando necesitaba los paneles estos de solapas no solía usar ningún control, ya tenía hecho mi propio sistema, (si quieres verlo, pasate por la página del Sentinel95), que al no necesitar instalar ni registrar ningún control, me lo ponía más fácil a la hora de distribuir las aplicaciones... pero cuando empecé con el VB4-32 bits, me fui acostumbrando a los controles estilo Win95, sobre todo por el StatusBar y el ToolBar, así que ya que lo tenía en la memoria ¿por qué no usarlo?
Y ahí empezaron los primeros quebraderos de cabeza...
¿Cómo saber que solapa se había pulsado?
¿Cómo simular que se había pulsado una solapa?
Pero una vez superado esos problemas, ya es como el coser y cantar, para los que sepan coser y cantar, claro está...

La cuestión de esta página es que tengas un ejemplo de como hacer y usar este control...
No esperes milagros, que a pesar de que la luna esté en Cuarto Creciente... no me está influyendo demasiado...

Este control no tiene un contenedor en el que colocar los controles que quermos mostrar cuando se pulse en una u otra solapa, para ello tendrás que usar un control que pueda contener otros controles, normalmente se suele usar el Picture, pero el Frame también es válido, además de que consume algo de menos recursos, por supuesto que se pueden usar otros controles, incluso los SSPanel... pero, por simpleza, vamos a usar en este ejemplo un frame.

Para ello se suelen usar estos contenedores en un array, de forma que sea fácil cambiar de uno a otro, sin tener que hacer esfuerzos extra de programación. El truco consiste en mostrar el contenedor adecuado cuando se pulse en una de las solapas.

Veamos el ejemplo que he preparado, en el cual tendremos varios controles y dos solapas, en una de ellas habrá unos TextBoxes que nos permitirán cambiar el nombre de las solapas. También tendremos un botón que nos permitirá crear nuevas solapas en nuestro control Tab y por supuesto también creará y situará correctamente el nuevo contenedor que necesitemos, aunque este último método, el de crear nuevas solapas y contenedores sólo serán aplicables en situaciones "extrictamente" necesarias y bien "preparadas" ya que tendremos que poner controles dentro de ese contenedor, pero pueden haber muchas situaciones en las que sea necesario y no precisamente demasiado complicadas, se me ocurre por ejemplo una aplicación de base de datos en la que no sepamos de antemano el número de campos, por poner un ejemplo.

Bien dejemos ya este rollo y pasemos a la acción, veamos primero una "foto" del form, (aunque poco veremos ya que están casi todos los controles ocultos), pero algo es algo.

 

Situar correctamente el contenedor dentro del Control Tab

Para hacer esto, tenemos que usar las propiedades Clientxxx del TabStrip, por ejemplo ClientLeft nos dará la posición izquierda en la que debería estar el contenedor.
Pero para adaptarlo a la posición y tamaño, haremos esto otro:

Dim i&

'Ajustar el tamaño de los contenedores al TabStrip
With TabStrip1
    For i = 1 To .Tabs.Count
        fraCont(i - 1).Move .ClientLeft, .ClientTop, .ClientWidth, .ClientHeight
    Next
End With

Las solapas (Tabs), están contenidas en una colección de objetos Tab, por tanto para saber cuantas solapas hay, sólo tendremos que preguntarle a la colección el número que tiene, y como toda colección que se precie, tiene una propiedad Count que nos dice el número de solapas, y eso es precisamente lo que hace .Tabs.Count

 

Mostrar el contenedor adecuado al hacer Click en una solapa.

Esto se consigue en el evento Click del TabStrip, para ello tenemos que saber que solapa es la seleccionada, esto se consigue con SelectedItem y la propiedad Index de ese objeto, nos indica la que está seleccionada.
SelectedItem trabaja con objetos del tipo Tab, por esto hay que indicar el Index, para saber cual es la que está activa, pero fijate que le restamos uno para mostrar el contenedor correspondiente y esto es porque las colecciones suelen empezar por el índice UNO, sin embargo los arrays de controles empiezan por cero.

Private Sub TabStrip1_Click()
    'Cuando se pulsa en el tabstrip...
    Dim i&
    
    i = TabStrip1.SelectedItem.Index
    'Mostrar el contenedor que corresponda
    fraCont(i - 1).ZOrder
    
End Sub

Modificar la etiqueta (caption) de las solapas

Para hacer esto, sólo hay que cambiar el Caption de la solapa que queramos, en el código siguiente, se hace mediante el contenido de unos TextBoxes, pero se puede hacer directamente.
Por ejemplo para cambiar el Caption de la solapa (Tab) número dos:
TabStrip1.Tabs(2).Caption = "Nuevo caption"

Private Sub cmdCambiarNombre_Click()
    'Nombre de las solapas
    Dim i As Integer
    Dim sTmp As String
        
    For i = 0 To TabStrip1.Tabs.Count - 1
        sTmp = txtNombre(i)
        If Len(sTmp) Then
            TabStrip1.Tabs(i + 1).Caption = sTmp
        End If
    Next
End Sub

Añadir nuevas solapas al TabStrip

Para añadir nuevas solapas, usaremos el método Add de la colección Tabs, aunque también se puede usar otro método más enrevesado pero que lo pongo porque permitirá usar o crear un objeto TAB, este objeto hay que declararlo usando el nombre de la librería de objetos en la que está, ya que no es posible crearlo directamente.

'Esto daría error
Dim vTab As New Tab


'Hay que indicar el nombre de la librería:
Dim vTab As New ComctlLib.Tab

'Para añadir una nueva...
Set vTab = TabStrip1.Tabs.Add(, , "Nueva " & i)

Pero es más sencillo por el método tradicional, sin necesidad de crear un objeto intermedio, aunque lo he puesto por fines didáctivos, ya que esta sería la forma de crear nuevos items en un ListView y demás controles "especiales".
Este es el código usado en el programa:

'Número de Tabs + 1
i = TabStrip1.Tabs.Count + 1

'Añadir un nuevo Tab
sTmp = "Tab núm " & i
TabStrip1.Tabs.Add , , sTmp

Activar una de las solapas

Para activar una de las solapas no se puede hacer directamente esto: (que es lo que yo usaba, pero sin ningún éxito)

'Activar la solapa recién creada: (esto no funciona)
TabStrip1.SelectedItem.Index = i

Hay que asignar al objeto SelectedItem el Tab que queremos que esté activo:

'Activar la solapa recién creada:
Set TabStrip1.SelectedItem = TabStrip1.Tabs(i)

Nota: También se puede activar una solapa con este código: (gracias a Luis Sanz)

'Activar la solapa recién creada:
TabStrip1.Tabs(i).Selected = True

Prácticamente esto es todo lo que necesitas saber para que los TabStrips no se te resistan, pero para comprobarlo, he creado una aplicación de ejemplo, está codificada en VB5, pero con pequeños cambios podrás usarlo en VB4-32.
Normalmente esos cambios será que edites el fichero tabstrip.frm y cambies las dos primeras líneas:

VERSION 5.00
Object = "{6B7E6392-850A-101B-AFC0-4210102A8DA7}#1.2#0"; "COMCTL32.OCX"

Por esta otra:
VERSION 4.00

El único problema con los frames como contenedores en el VB4 es que siempre deben tener borde, ya que en esa versión no se permite tener Frames sin bordes, pero eso puede arreglarse usando un Picture.

 

El código de ejemplo

O bien te creas un nuevo proyecto que tenga un control TabStrip y los demás controles usados (los cuales no te enumero por no alargar el contenido de esta página) y le añadas este código al formulario:

'
Private Sub Form_Load()
    Label1(0) = "Prueba del control TabStrip"
    
    Dim i&
    
    'Ajustar el tamaño de los contenedores al TabStrip
    With TabStrip1
        For i = 1 To .Tabs.Count
            fraCont(i - 1).Move .ClientLeft, .ClientTop, .ClientWidth, .ClientHeight
        Next
    End With
    
    'poner el primer contenedor encima del resto
    fraCont(0).ZOrder
    
End Sub


Private Sub TabStrip1_Click()
    'Cuando se pulsa en el tabstrip...
    Dim i&
    
    i = TabStrip1.SelectedItem.Index
    'Mostrar el contenedor que corresponda
    fraCont(i - 1).ZOrder
    
End Sub


Private Sub cmdCambiarNombre_Click()
    'Nombre de las solapas
    Dim i As Integer
    Dim sTmp As String
        
    For i = 0 To TabStrip1.Tabs.Count - 1
        sTmp = txtNombre(i)
        If Len(sTmp) Then
            TabStrip1.Tabs(i + 1).Caption = sTmp
        End If
    Next
End Sub


Private Sub cmdNueva_Click()
    Dim i As Integer
    Dim sTmp As String
    Static NumLabel1 As Long
        
    'Número de Tabs + 1
    i = TabStrip1.Tabs.Count + 1
    
    'Añadir un nuevo Tab
    sTmp = "Tab núm " & i
    TabStrip1.Tabs.Add , , sTmp
    
    'También se pueden crear así:
    'Hay que indicar el nombre de la librería:
    'Dim vTab As New ComctlLib.Tab
    '
    'Set vTab = TabStrip1.Tabs.Add(, , sTmp)
        
        
    'Ajustar los nuevos controles
    Load fraCont(i - 1)
    With TabStrip1
        fraCont(i - 1).Move .ClientLeft, .ClientTop, .ClientWidth, .ClientHeight
    End With
    'Añadir un nuevo Text y Label para el cambio de nombre
    Load lblNombre(i - 1)
    Load txtNombre(i - 1)
    
    fraCont(i - 1).Visible = True
    lblNombre(i - 1).Visible = True
    txtNombre(i - 1).Visible = True
    
    'Aunque esto no es necesario...
    Set txtNombre(i - 1).Container = fraCont(0)
    Set lblNombre(i - 1).Container = fraCont(0)
    
    txtNombre(i - 1).Top = txtNombre(i - 2).Top + txtNombre(i - 2).Height + 60
    lblNombre(i - 1).Top = txtNombre(i - 1).Top + 15
    lblNombre(i - 1).Caption = "Nombre de la solapa " & i
    
    'Añadir un control a la nueva solapa
    NumLabel1 = NumLabel1 + 1
    Load Label1(NumLabel1)
    
    With Label1(NumLabel1)
        'Asignarle el nuevo contenedor
        Set .Container = fraCont(i - 1)
        'Y algo para que sepamos que está allí
        .Caption = "Esta etiqueta está contenida en la solapa " & i
        'Siempre que se cargan nuevos controles la propiedad
        'visible está puesta a False...
        .Visible = True
    End With
    
    'Hacer que la nueva solapa sea la activa
    Set TabStrip1.SelectedItem = TabStrip1.Tabs(i)
End Sub

Pulsa en este link, si quieres bajarte el listado de ejmplo (TabStrip.zip 2.73 KB)

la Luna del Guille o... el Guille que está en la Luna... tanto monta...