cStatusBar

Clase para simular el control StatusBar

 

Publicado el 8/Jul/1998


Esta clase es una versión "muy" reducida, que simula el control StatusBar que incluye el Visual Basic en el OCX de los controles para Windows 95.
La razón de hacerlo es porque, después de muchas comprobaciones, descubrí que ese control me daba error de automatización, así que decidí crearme una clase simple para poder usarlo casi de la misma forma. Realmente sólo lo he usado en una aplicación: la de mensajería interna, que pronto pondré en línea la versión "nueva", con icono en la barra de tareas y esas chorradillas.

Además de esta clase, también tengo otra que la uso para simular las solapas (Tabs), ya que el control antes mencionado también lo incluye y claro, al estar juntos, no me permitía usarlo, aunque esa "clase de solapas" ya la he usado antes, (y publicado en el Sentinel95), aunque ahora la tengo hecha en una clase... un día de estos la publicaré.

Ya te comento que no es ninguna virguería, pero que lo hice para no tener que cambiar demasiado código y por supuesto tiene muchas cosas que se pueden mejorar y sobre todo cosas que añadir para mejorar "la prestación".
Pero por ahora estoy es lo que hay... así que...

Este es el código de las clases: (después te indicaré cómo usarla)

'
'------------------------------------------------------------------
'cPanel                                                 (31/Mar/98)
'
'Descripción:
'   Clase para simular los paneles de un StatusBar
'
'©Guillermo 'guille' Som, 1998
'------------------------------------------------------------------
Option Explicit

Private mControl As Control
Private mKey As String
Private mText As Variant


Public Property Get Text() As Variant
    Text = mText
End Property

Public Property Let Text(ByVal NewText As Variant)
    mText = " " & NewText
    mControl = mText
End Property

Public Property Get Key() As String
    Key = mKey
End Property

Public Property Let Key(ByVal NewKey As String)
    Static Asignada As Boolean
    
    If Not Asignada Then
        Asignada = True
        mKey = NewKey
    End If
End Property

Public Property Get Control() As Control
    Set Control = mControl
End Property

Public Property Set Control(NewControl As Control)
    Set mControl = NewControl
End Property

Public Property Get Caption() As Variant
    Caption = mText
End Property

Public Property Let Caption(ByVal NewCaption As Variant)
    'Esta propiedad es para que haya también un caption
    Text = NewCaption
End Property
'
'------------------------------------------------------------------
'cStatusBar                                             (31/Mar/98)
'
'Descripción:
'   Clase para simular el control StatusBar
'   Se tiene que usar también la clase cPanel
'
'©Guillermo 'guille' Som, 1998
'------------------------------------------------------------------
Option Explicit

Dim colPaneles As New Collection


Public Function Panels(Optional Index As Variant) As Variant
    'Devolverá / asignará el caption de una de las etiquetas
    Dim tPanel As New cPanel
    
    On Local Error Resume Next
    
    If IsMissing(Index) Then
        Set Panels = colPaneles
    Else
        Set Panels = colPaneles(Index)
        If Err Then
            Set tPanel = Nothing
            tPanel.Key = Index
            colPaneles.Add tPanel, tPanel.Key
            Set Panels = tPanel
        End If
    End If
    Set tPanel = Nothing
    
    Err = 0
End Function

Public Sub Nuevo(ByVal sKey As String, unControl As Control)
    'Añade un nuevo Panel
    Dim tPanel As New cPanel
    
    With tPanel
        .Key = sKey
        Set .Control = unControl
        'Asigna al Text el valor por defecto de este control
        'Si es un Label, se asignará el Caption
        'en caso de un TextBox será el Text...
        .Text = unControl
        colPaneles.Add tPanel, sKey
    End With
    
    Set tPanel = Nothing
End Sub

Public Sub Add(unControl As Control, ByVal sKey As String)
    'Este método está por compatibilidad
    'Fíjate que se usa al revés que Nuevo:
    'Primero el Objeto y luego la Clave
    Nuevo sKey, unControl
End Sub

La forma de usarla es muy simple:
Añade las clases cPanel y cStatusBar al proyecto.
Añade un array de etiquetas o textboxes que harán las veces del panel (realmente será donde se muestre el mensaje que quieras)

Declara una variable cStatusBar en el form en el que vayas a usarla:
Dim StatusBar1 As cStatusBar

En el Form_Load le das vida a la nueva variable, asignándola para que apunte a un nuevo objeto de este tipo:
Set StatusBar1 = New cStatusBar

A la hora de descargarse el formulario, en el Form_UnLoad hay que quitarla de la memoria:
Set StatusBar1 = Nothing

Para asignar los "paneles", se hará normalmente en el evento Load, usa cualquiera de las dos formas que se muestran a continuación.
En este ejemplo se supone que el control que vamos a usar en el form para simular los paneles del StatusBar es :lblStatusBar, que será un array con los paneles que vamos a usar:

'
    With StatusBar1
        .Nuevo "Status", lblStatusBar(0)
        .Nuevo "Mensajes", lblStatusBar(1)
        '.Nuevo "Nuevos", lblStatusBar(2)
        'También se permite
        .Add lblStatusBar(2), "Nuevos"
    End With

'
'Cuando quieras usarlo, por ejemplo para asignar un nuevo "contenido" en uno de los paneles:
'
StatusBar1.Panels("Status") = sItem

Como ves no tiene ninguna complicación y tampoco hace mucho por ayudarnos, ya que tendrás que "situarlas" manualmente en el sitio que quieras.
Normalemente suelo colocar las etiquetas en un pictureBox (u otro contenedor), le asigno la propiedad Align=Botton, para que se situe en la parte baja del formulario y en el evento Resize situo las etiquetas.
En este caso el contenedor es un PictureBox que se llama picStatus.

'Aquí ya tengo calculados los tamaños y se ajustan automáticamente cuando se redimensiona
Private Sub picStatusBar_Resize()
    If WindowState <> vbMinimized Then
        'Posicionar los lblStatusBar 1 y 2
        lblStatusBar(2).Left = picStatusBar.ScaleWidth - 1140
        lblStatusBar(1).Left = lblStatusBar(2).Left - 1155
        lblStatusBar(0).Width = picStatusBar.ScaleWidth - 2370
    End If
End Sub

Espero que te pueda ser útil, en otra ocasión veremos cómo usar y configurar la clase cSolapa (Tabs)

Nos vemos
Guillermo


ir al índice