Вы находитесь на странице: 1из 11

Barras de desplazamiento con valor

siempre visible

Este es un simple módulo de clase que puede ser útil cuando necesitamos utilizar barras
de desplazamiento en nuestros programas, y poder visualizar el valor actual de la barra (
propiedad Value) en todo momento, y que además dicho valor se posicione y muestre
junto al botón del ScrollBar.

El ejemplo está basado en este otro, pero en este caso , como se dijo, se utiliza un
simple módulo de clase por dos motivos, uno para poder utilizarlo con varias barras de
scroll. Ya que el ejemplo anterior, si se desea utilizar muchas, se debería agregar
demasiado código en el formulario. Otro motivo, es para que al utilizarlo desde el
módulo, poder añadir propiedades extra y algunos eventos para cada necesidad. Por
defecto solo contiene propiedades básicas, y no difiere mucho del ejemplo anterior. Pero
ya teniendo la base ( es decir el módulo implementado), es mucho mas fácil poder
añadir nuestra propias opciones. Por ejemplo se podría modificar para desplegar un
ToolTip multilinea , en ves de el texto que visualiza el value del Scroll, por decir un
caso. Aunque esto último no e intentado realizarlo, y por eso no se y tampoco tengo idea
si se debería cambiar mucho el código.

Otro error importante que se corrigió, con respecto al anterior ejemplo, es que si la barra
la debíamos utilizar dentro de un contenedor ( Frame o PictureBox), no se podía ( a no
ser modificando el código). Ahora el módulo, se encarga de obtener el objeto
contenedor, y nosotros depreocuparnos si la barra está contenida dentro del form, o de
un frame , o de un PicBox.

De todas formas, como se dijo, es un simple ejemplo, se puede optimizar mucho, añadir
funcionalidades, corregir algunas otras que seguramente tiene, pero un poco mas
funcional y fácil de utilizar que el anterior seguramente lo es, ya que solo se necesita:
Añadir una ScrollBar y crear una instancia para asociarla a la barra.

Vista previa del código fuente de ejemplo.


Importante.

Para utilizar el módulo de clase, y poder utilizar las barras, se debe crear una instancia
del módulo, por cada barra que se utilice. Por ejemplo, si voy a utilizar dos barras, se
debería declarar en el formulario lo siguiente

Texto planoImprimir
1. ' \\ -- Variables de clase para cada una de las barras
2. ' --------------------------------------------------------------------------------
3. Private WithEvents mCHScrollTip1 As ClsHScrollValue
4. Private WithEvents mCHScrollTip2 As ClsHScrollValue

Luego, en la carga del formulario que utilice las barras, se debería ( luego de instanciar
las variables de módulo ), ejecutar el método Init con los siguientes parámetros

Call .Init (Barra horizontal, Valor Mínimo, Valor Máximo, Valor actual)

Importante. PAra ubicar las barras en el form ( es decir posicionarlas y redimensionarlas


), no utilizar el método Move de cada barra, si no el método MoveHS del módulo.

Ejemplo

 Iniciar y crear un nuevo proyecto en visual basic.


 Añadir al formulario 3 barras de Scroll Horizontal ( Dejarles el nombre por
defecto: HScroll1, HScroll2, HScroll3)
 Añadir un módulo de clase ( Cambiarle el nombre por defecto Class1 a
ClsHScrollValue)
 Agregar un botón

Código fuente a pegar en el formulario

Texto planoImprimir
1. Option Explicit
2.
3. ' --------------------------------------------------------------------------------
4. ' \\ -- Declaraciones
5. ' --------------------------------------------------------------------------------
6. Private Declare Sub InitCommonControls Lib "comctl32" ()
7.
8. ' \\ -- Variables de clase para cada una de las barras
9. ' --------------------------------------------------------------------------------
10. Private WithEvents mCHScrollTip1 As ClsHScrollValue
11. Private WithEvents mCHScrollTip2 As ClsHScrollValue
12. Private WithEvents mCHScrollTip3 As ClsHScrollValue
13.
14. ' ---------------------------------------------------------------------------------
15. ' \\ -- Botón para restaurar valor por defecto
16. ' ---------------------------------------------------------------------------------
17. Private Sub Command1_Click()
18. ' -- Scroll 1
19. With mCHScrollTip1
20. .Value = .DefaultValue
21. End With
22. ' -- Scroll 2
23. With mCHScrollTip2
24. .Value = .DefaultValue
25. End With
26. ' -- Scroll 3
27. With mCHScrollTip3
28. .Value = .DefaultValue
29. End With
30. End Sub
31.
32. ' ---------------------------------------------------------------------------------
33. ' \\ -- Inicio
34. ' ---------------------------------------------------------------------------------
35. Private Sub Form_Initialize()
36. Call InitCommonControls
37. End Sub
38.
39. Private Sub Form_Load()
40.
41. ' -- Crear instancia del módulo de clase para las tres barras
42. Set mCHScrollTip1 = New ClsHScrollValue
43. Set mCHScrollTip2 = New ClsHScrollValue
44. Set mCHScrollTip3 = New ClsHScrollValue
45.
46. ' -- Iniciar el módulo, pasándole la barra de desplazamiento, el formulario actu
al
47. ' y si el valor se debe ocultar al perder el foco, y si se visualiza el borde del l
abel
48.
49. ' -- Barra 1 ( Este oculta el texto al perder el foco)
50. With mCHScrollTip1
51. ' -- Iniciar
52. .DefaultValue = 100
53. Call .Init(HScroll1, Me, -200, 200, 100, 10, 10, False, False, vbRed)
54. ' -- Posicionar y ubicar en la ventana
55. Call .MoveHS(500, 200, 2000, 255)
56. End With
57. ' -- Barra 2
58. With mCHScrollTip2
59. .DefaultValue = 0
60. Call .Init(HScroll2, Me, 0, 255, 100, 10, 10, False, False, RGB(135, 169, 2
50))
61. Call .MoveHS(500, mCHScrollTip1.Top + mCHScrollTip1.Height + 100, 2
000, 255)
62. End With
63. ' -- Barra 3
64. With mCHScrollTip3
65. .DefaultValue = 25000
66. Call .Init(HScroll3, Me, 0, 32000, 10000, 250, 250, False, False, RGB(126,
126, 126))
67. Call .MoveHS(500, mCHScrollTip2.Top + mCHScrollTip2.Height + 100, 2
000, 255)
68. End With
69. Command1.Caption = "Restaurar valores por defecto"
70.
71. End Sub
72. ' ----------------------------------------------------------------------------------
73. ' \\ -- Terminar instancia para eliminar los controles creados en forma dinámica
74. ' ----------------------------------------------------------------------------------
75. Private Sub Form_Unload(Cancel As Integer)
76. Set mCHScrollTip1 = Nothing
77. Set mCHScrollTip2 = Nothing
78. Set mCHScrollTip3 = Nothing
79. End Sub
80. ' ----------------------------------------------------------------------------------
81. ' \\ -- Evento que recupera el valor al desplazar la barra ( para la barra 1)
82. ' ----------------------------------------------------------------------------------
83. Private Sub mCHScrollTip1_ChangeValue(ByVal iValue As Integer)
84. Me.Caption = iValue
85. End Sub
86. ' ----------------------------------------------------------------------------------
87. ' \\ -- Evento que recupera el valor al desplazar la barra ( para la barra 2)
88. ' ----------------------------------------------------------------------------------
89. Private Sub mCHScrollTip2_ChangeValue(ByVal iValue As Integer)
90. Me.Caption = iValue
91. End Sub
92. ' ----------------------------------------------------------------------------------
93. ' \\ -- Evento que recupera el valor al desplazar la barra ( para la barra 3)
94. ' ----------------------------------------------------------------------------------
95. Private Sub mCHScrollTip3_ChangeValue(ByVal iValue As Integer)
96. Me.Caption = iValue
97. End Sub

Código fuente a pegar dentro del módulo de clase llamado ClsHScrollValue

Texto planoImprimir
1. Option Explicit
2.
3. ' ------------------------------------------------------------------------------------------------
-----------
4. ' -- Descripción: Simple módulo para mostrar un tip/Text al mover una barra de d
esplazamiento horizontal de vb utilizando un label
5. ' -- Autor original del ejemplo ( función pvShowValue -- Desconocido -- Creo qu
e el ejemplo es del sitio web www.a1vbcode.com )
6. ' -- Adaptado para usarlo en un módulo de clase para poder implementarlo con v
arios scroll: ( Luciano Lodola -- http://www.recursosvisualbasic.com.ar/)
7. ' -- Derechos : Este ejemplo no contiene limitaciones de uso:
8. ' Se puede utilizar, modificar y distribuir sin ningún tipo de restricción.
9. ' En caso de publicar en un sitio o utilizarlo en un programa, se agradec
e mensionar y mantener el nombre de los autores del mismo
10.
11.
12. ' ------------------------------------------------------------------------------------------------
-----------
13.
14. ' -- Importante: Solo implementado para utilizarlo con Scrolls horizontales,
15. ' ( Falta el código para adaptarlo con Barras verticales, y algunas propie
dades y eventos básicos )
16. ' --------------------------------------------------------------------------------
17.
18. ' --------------------------------------------------------------------------------
19. ' \\ -- Declaraciones
20. ' --------------------------------------------------------------------------------
21.
22. Private Type TOpciones
23. lBorderStyle As Integer
24. HideLostFocus As Boolean
25. End Type
26.
27. ' -- Variables
28. Private x As Double
29. Private y As Double
30. Private WithEvents mHSBar As hScrollBar ' -- Declaración de co
ntroles
31. Private WithEvents mVS As VScrollBar
32. Private WithEvents mPicContainer As PictureBox
33. Private WithEvents mText As Label
34. Private WithEvents mOwnerForm As Form
35. Private mNameContainer As String ' -- Nombres para poder
descargarlos
36. Private mNameLabel As String
37. Private OptionLabel As TOpciones ' -- Opciones del texto de
l label
38. Private bInitActivateFlag As Boolean
39. Private mDefaultValue As Integer ' -- Valor por defecto de las
barras
40.
41. ' -- Eventos
42. Event ChangeValue(ByVal iValue As Integer)
43.
44. ' --------------------------------------------------------------------------------
45. ' \\ -- Fin del módulo
46. ' --------------------------------------------------------------------------------
47. Private Sub Class_Terminate()
48. 'On Error Resume Next
49. With mOwnerForm
50. If Not mOwnerForm Is Nothing Then
51. Set mHSBar.Container = mOwnerForm
52. Call .Controls.Remove(mNameLabel)
53. Call .Controls.Remove(mNameContainer)
54. End If
55. End With
56. 'On Error GoTo 0
57. End Sub
58. ' --------------------------------------------------------------------------------
59. ' \\ -- Inicio del módulo
60. ' --------------------------------------------------------------------------------
61. Sub Init( _
62. hScrollBar As hScrollBar, _
63. OwnerForm As Form, _
64. MinValue As Integer, _
65. MaxValue As Integer, _
66. iValue As Integer, _
67. Optional iLargeChange As Integer = 1, _
68. Optional iSmallChange As Integer = 1, _
69. Optional HideLostFocus As Boolean = False, _
70. Optional ShowBorderStyle As Boolean = False, _
71. Optional lForeColorText As Long)
72.
73.
74. On Error GoTo Error_Handler
75.
76. ' -- Variables
77. Dim mParent As Object
78.
79. ' --- Referenciar controles para poder usarlos internemente
80. ' dentro del módulo y también acceder a los eventos
81. ' ( Están declarados con WithEvents )
82. Set mHSBar = hScrollBar
83. Set mOwnerForm = OwnerForm
84. ' -- Referncia al control contenedor de las barras ( puede ser el form, un pictur
e o un frame), _
85. No está implementado para mas de un contenedor, por ejemplo un Frame d
entro de un picture, y las barras dentro del frame
86. Set mParent = mHSBar.Container
87. ' -- Opciones del texto
88. With OptionLabel
89. .HideLostFocus = HideLostFocus
90. .lBorderStyle = Abs(ShowBorderStyle)
91. End With
92. Dim xNumber As Variant
93. Randomize (Timer)
94. xNumber = CInt(Rnd * 32000)
95. ' -- Crear nombres únicos de controles ( Por si se utilizan varias instancias del
módulo)
96. mNameLabel = "Label" & CStr(Val(xNumber))
97. mNameContainer = "PicContainer" & CStr(Val(xNumber))
98.
99. ' -- Crear controles en forma dinámica ( contenedor y label para el texto)
100. With mOwnerForm
101. Set mPicContainer = .Controls.Add("vb.PictureBox", mNameContai
ner)
102. Set mText = .Controls.Add("vb.Label", mNameLabel)
103. End With
104.
105. ' -- Setear el Scrollbar
106. With mHSBar
107. .Min = MinValue
108. .Max = MaxValue
109. .Value = iValue
110. .SmallChange = iSmallChange
111. .LargeChange = iLargeChange
112. Set .Container = mPicContainer
113. End With
114. ' -- Setear el contenedor
115. With mPicContainer
116. .BorderStyle = 0
117. .Width = mHSBar.Width
118. .BackColor = mParent.BackColor
119. .Visible = True
120. Set .Container = mParent
121. End With
122. ' -- Setear el Label
123. With mText
124. .FontName = "Verdana"
125. .BorderStyle = OptionLabel.lBorderStyle
126. .BackStyle = 0
127. .ForeColor = lForeColorText
128. .AutoSize = True
129. Set .Container = mPicContainer
130. If (OptionLabel.HideLostFocus = False) Then
131. .Visible = True
132. End If
133. End With
134.
135. If Not mParent Is Nothing Then Set mParent = Nothing
136.
137. Exit Sub
138. ' -- Errores
139. Error_Handler:
140. MsgBox Err.Number, vbCritical, "Error en INIT"
141. End Sub
142. ' -------------------------------------------------------------------------------------
143. ' \\ -- Evento de cambio de valor de la barra de desplazamiento
144. ' -------------------------------------------------------------------------------------
145. Private Sub mHSBar_Change()
146. Call pvShowValue
147. End Sub
148. ' -------------------------------------------------------------------------------------
149. ' \\ -- Evento cuando obtiene el foco la barra de desplazamiento
150. ' -------------------------------------------------------------------------------------
151. Private Sub mHSBar_GotFocus()
152. With mText
153. .Visible = True
154. End With
155. Call mHSBar_Change
156. End Sub
157. ' -------------------------------------------------------------------------------------
158. ' \\ -- Interceptar el evento KeyDown de la barra, _
159. ' para cambiar el valor con las teclas izquierda y derecha
160. ' La magnitud del cambio la define el valor SmallChange pasado en la
función Init de este módulo
161. ' -------------------------------------------------------------------------------------
162. Private Sub mHSBar_KeyDown(KeyCode As Integer, Shift As Integer)
163. With mHSBar
164. ' -- Tecla izquierda ( Disminuir valor )
165. Select Case KeyCode
166. Case vbKeyLeft
167. If (.Value - .SmallChange) < .Min Then
168. .Value = .Min
169. Else
170. .Value = .Value - .SmallChange
171. End If
172. ' -- Tecla derecha ( Aumentar el valor )
173. Case vbKeyRight
174. If (.Value + .SmallChange) > .Max Then
175. .Value = .Max
176. Else
177. .Value = .Value + .SmallChange
178. End If
179. End Select
180. End With
181. End Sub
182. ' -------------------------------------------------------------------------------------
183. ' \\ -- Interceptar el evento LostFocus para ocultar el Value en caso de hab
er pasado
184. ' el Valor True en el parámetro HideLostFocus de la función Init
185. ' -------------------------------------------------------------------------------------
186. Private Sub mHSBar_LostFocus()
187. On Error GoTo Error_Handler
188. mText.Visible = Not (OptionLabel.HideLostFocus)
189. ' -- Errores
190. Exit Sub
191. Error_Handler:
192. End Sub
193. ' -------------------------------------------------------------------------------------
194. ' \\ -- Actualizar label/texto en el Evento de Scroll de la barra de desplaza
miento
195. ' -------------------------------------------------------------------------------------
196. Private Sub mHSBar_Scroll()
197. Call pvShowValue
198. End Sub
199. ' -------------------------------------------------------------------------------------
200. ' \\ -- Procedimiento privado para mostrar el valor al cambiar el scroll
201. ' -------------------------------------------------------------------------------------
202. Private Sub pvShowValue()
203. Dim k As Double
204. If (Not mHSBar Is Nothing) Or (Not mText Is Nothing) Then
205. With mText
206. .Caption = Trim(Str(mHSBar.Value))
207. k = Len(.Caption)
208. .Move (y + x * (mHSBar.Value - mHSBar.Min) - (k * 50) - 10), (
mHSBar.Top - .Height)
209. ' -- Lanzar evento ( es el mismo que se puede acceder desde el
210. ' form con la propiedad Scroll/Change de la barra. Está impleme
ntado nada mas,
211. ' por si se desea hacer alguna validación, o enviar algún parámet
ro extra)
212. RaiseEvent ChangeValue(CInt(.Caption))
213. End With
214. End If
215. End Sub
216. ' -------------------------------------------------------------------------------------
217. ' \\ -- La única forma que se me ocurrió de poder corregir el
218. ' error de posicionar el valor al iniciar el módulo
219. ' ya que si no no lo acutualizaba.
220. ' -------------------------------------------------------------------------------------
221. Private Sub mOwnerForm_Activate()
222. ' -- Se ejecuta una solo vez ( Actualiza la posición del
223. ' label con respecto al botón de la barra)
224. If Not bInitActivateFlag Then
225. bInitActivateFlag = True
226. Call pvShowValue
227. End If
228. End Sub
229. ' -------------------------------------------------------------------------------------
230. ' \\ -- Redimensionar contenedor del texto
231. ' -------------------------------------------------------------------------------------
232. Private Sub mPicContainer_Resize()
233. ' -- Posicionar y redimensionar el label y la barra
234. With mText
235. .Move 0, 0, 540, 225
236. mHSBar.Move 0, (.Top + .Height)
237. End With
238. ' -- Posicionar y redimensionar el contenedor
239. With mPicContainer
240. .Width = mHSBar.Width
241. .Height = mText.Height + mHSBar.Height
242. x = ((.Width - 600) / (mHSBar.Max - mHSBar.Min))
243. y = 300
244. End With
245. End Sub
246. ' -------------------------------------------------------------------------------------
247. ' \\ -- Método para posicionar las barras ( la posición
248. ' izquierda, el top, el ancho y alto)
249. ' -------------------------------------------------------------------------------------
250. Sub MoveHS(x As Single, y As Single, x1 As Single, Optional y1 As Sin
gle = 255)
251. With mPicContainer
252. .Left = x
253. .Top = y
254. End With
255. With mHSBar
256. .Width = x1
257. .Height = y1
258. End With
259. Call mPicContainer_Resize
260. End Sub
261. ' ------------------------------------------------------------------------------------
262. ' \\ -- Propiedades para definir la ubicación y dimensiones de la barra
263. ' ------------------------------------------------------------------------------------
264. Property Get Width() As Single
265. Width = mPicContainer.Width
266. End Property
267. Property Get Height() As Single
268. Height = mPicContainer.Height
269. End Property
270. Property Get Top() As Single
271. Top = mPicContainer.Top
272. End Property
273. Property Get Left() As Single
274. Left = mPicContainer.Left
275. End Property
276. ' -------------------------------------------------------------------------------------
277. ' \\ -- Propiedad para recuperar el valor actual, Mínimo y máximo
278. ' -------------------------------------------------------------------------------------
279. Property Get Value() As Integer
280. Value = CInt(mText.Caption)
281. End Property
282. Property Let Value(iValue As Integer)
283. mHSBar.Value = iValue
284. Call mHSBar_Change
285. End Property
286. ' -------------------------------------------------------------------------------------
287. ' \\ -- Propiedad para guardar un valor por defecto y luego poder restaurar

288. ' Importante: No se comprueba que de error con los Min,Max, Value,
al asignar la propiedad
289. ' -------------------------------------------------------------------------------------
290. Property Get DefaultValue() As Integer
291. DefaultValue = mDefaultValue
292. End Property
293. Property Let DefaultValue(ByVal iValue As Integer)
294. mDefaultValue = iValue
295. If Not mHSBar Is Nothing Then
296. mHSBar.Value = mDefaultValue
297. Call pvShowValue
298. End If
299. End Property