INTRODUCCION
¿Ha experimentado que el área de un formulario no es suficiente?, ¿Ha desarrollado para 800x600 y sus usuarios se empeñan en 640x480?, ¿Extraña los formularios de Access?. Este articulo explicara un método super-fácil de implementar un área desplazable.
Les confieso que le dedique buen tiempo para lograr esto hasta que llegue a la técnica estándar. Curiosamente existe un articulo Visual Basic del ToolKit de Microsoft (Visual Basic anteriores a la versión 5.0) acerca de una área desplazable, para una imagen,
pero francamente para controles resulta poco atractivo. Las dos técnicas curiosamente coinciden en lo básico, alguien diría que son copia. Mi primer objetivo era poder implementar formularios con misma interfaz y flexibilidad a los que creas con Microsoft
Access ®. El código es para Visual Basic 5.0 y es tan perfecto como cualquier formulario de un software Microsoft.
DESARROLLO
La idea básica es tener un contenedor, que llamaré Area Virtual, dentro de otro contenedor, que llamaré Area Visual. Para que exista Scroll, el Area Virtual debe ser mayor que el Area Visual, la cual varia en tamaño según se arrastren y suelten los bordes del formulario. La implementación se logra siguiendo estos pasos:
1.Cree un formulario, agregue un Frame que llamará frm_AreaVirtual (Name: frm_AreaVirtual ), y diseñe su formulario sin limitaciones de tamaño (puede ser mayor que su Screen - el diseño de formularios en VB5 lo permite). Coloque controles de acceso a datos, imágenes, comandos, etc, todo dentro de frm_AreaVirtual. Si lo prefiere, puede usar un formulario existente y lleve su contenido al interior del Frame frm_AreaVirtual.
2.Cree un segundo formulario (Name: frm_Muestra) y agregue un PictureBox (Name: pic_AreaVisual), corte el Frame frm_AreaVirtual del primer formulario y péguelo (paste) dentro de pic_AreaVisual. Añada un Control VScroll (Name: sc_Vertical) y uno HScroll (Name: sc_Horizontal) dentro de pic_AreaVisual (no se preocupe por el tamaño y posición de estos controles)
3.Opcionalmente, puede adicionar un Control que hará de Pie de Formulario a frm_Muestra, yo use otro PictureBox (para no añadir un OCX al ejemplo, pero usaría un SSPanel) y lo llame pic_PieDeFormulario. Este debe ir en el área del formulario, especifiqué Align: Bottom.
4.Por ultimo, pegue el código que suministro al final del articulo. No necesita más.
DETALLE. Observe la esquina inferior derecha de cualquier ventana Windows95 con Scroll y notará un pequeño diseño de barritas inclinadas con apariencia de relieve. Pues bien, mi implementación también incluye las susodichas barritas, es un pequeño BMP que incluyo en Download que acompaña este articulo y hace uso de un nuevo PictureBox (Name: pic_Esquina) dentro de pic_AreaVisual (no dentro frm_AreaVirtual). En realidad es necesario pero no indispensable, ya que la esquina del empate se ve mejor con esta imagen. Si no desea prescindir de la imagen de esquina, elimine todas la líneas de código que hacen referencia pic_Esquina y, en el evento Form_Resize, prolongue alguna de las barras Scroll para suplir el espacio.
CODIGO DE LA IMPLEMENTACION
DefInt A-Z
Option Explicit
Private Sub Form_Load()
'//Ajusta área virtual
frm_AreaVirtual.BorderStyle = 0
frm_AreaVirtual.Top = 0
frm_AreaVirtual.Left = 0
'//Opcional: Fija área visual al area de Me
pic_AreaVisual.Top = 0
pic_AreaVisual.Left = 0
'//Configura Scroll
With sc_Vertical
.Min = 0
.SmallChange = 90
.LargeChange = 300
.Top = 0
.ZOrder 0
End With
With sc_Horizontal
.Min = 0
.SmallChange = 90
.LargeChange = 300
.Left = 30
.ZOrder 0
End With
'//Uso de un área pie de formulario
pic_PieDeFormulario.BorderStyle = 0
'//Opcinal: Esquina del empate de los Scroll
' Picture = "EdgeScroll.bmp" '12X12 Pixeles
' BorderStyle = 0
' AutoSize = True
pic_Esquina.ZOrder 0
End Sub
Private Sub Form_Resize()
Dim ScrollMax
If Not WindowState = vbMinimized Then
On Error Resume Next
'//Ajusta area visual al formulario
pic_AreaVisual.Width = ScaleWidth
pic_AreaVisual.Height = ScaleHeight - pic_PieDeFormulario.Height
'//Ajusta barra Scroll al formulario
With sc_Vertical
.Height = pic_AreaVisual.ScaleHeight - sc_Horizontal.Height
.Left = pic_AreaVisual.ScaleWidth - .Width
'//Ajustar Scroll a nueva area
ScrollMax = frm_AreaVirtual.Height - pic_AreaVisual.Height + sc_Horizontal.Height
If ScrollMax > 0 Then
.Max = ScrollMax
.Enabled = True
Else
.Value = 0
.Enabled = False
End If
End With
With sc_Horizontal
.Top = pic_AreaVisual.ScaleHeight - .Height + 30
.Width = pic_AreaVisual.ScaleWidth - sc_Vertical.Width
'//Ajustar Scroll a nueva area
ScrollMax = frm_AreaVirtual.Width - pic_AreaVisual.Width + sc_Vertical.Width
If ScrollMax > 0 Then
.Max = ScrollMax
.Enabled = True
Else
.Value = 0
.Enabled = False
End If
End With
pic_Esquina.Move sc_Horizontal.Width, sc_Vertical.Height
pic_AreaVisual.SetFocus
End If
End Sub
Private Sub sc_Horizontal_Change()
'//Dezplaza área virtual dentro área visual
frm_AreaVirtual.Left = -sc_Horizontal.Value
End Sub
Private Sub sc_Vertical_Change()
'//Dezplaza área virtual dentro área visual
frm_AreaVirtual.Top = -sc_Vertical.Value
End Sub
Harvey Triana, psoft@latino.net.co