Está en la página 1de 6

CRÉDITOS CINE1

¿Qué puedo contaros de esta “fantasía” que nuestro amigo


Sveinbjorn se ha sacado de la manga?

En fin… os recomiendo que os bajéis la BD y la veáis en


acción, porque es curioso, curioso…

¿Y cómo se hace? Pues os dejo que el propio Sveinbjorn os


dé las explicaciones oportunas. Por mi parte solo mostrarle
mi agradecimiento por haberlo compartido con todos
nosotros. ¡Gracias, Sveinbjorn!

MOSTRAR REGISTROS ESTILO CRÉDITOS DE PELÍCULA


Este ejemplo tiene como origen una consulta realizada en el foro TodoExpertos, en la que se
preguntaba literalmente: “Me gustaría mostrar los registros de una tabla en forma de
animación de créditos de una película, ¿es posible hacerlo?”. Picada la curiosidad, y con un
pequeño empujón de Neckkito, salió este ejemplo.
Quizás sea poco útil en el día a día, pero sí que ofrece alguna utilidad visualmente interesante,
por ejemplo, se me ocurre si ponéis un formulario “Acerca de”, “Agradecimientos” o similar… y
además, sirve para trabajar con Colecciones.
Vamos al lío.

NUESTRAS TABLAS.
Ya que el ejemplo habla de “créditos de película”, vamos a plantear una mini-BD para registrar
películas y algunos datos de ellas. Para ello contaremos con 3 tablas interrelacionadas (¡ojo!
faltan muchos campos para ser una aplicación funcional, pero para el ejemplo sirve
perfectamente, pues lo interesante es que pilléis la mecánica) con la siguiente estructura:
TPeliculas:

TActores:

TCasting:

1 La BD de ejemplo os la podéis bajar aquí

1
Visítame en http://neckkito.siliconproject.com.ar
La tercera tabla nos sirve para simular una relación varios a
varios entre las dos primeras tablas. Los campos Pelicula y
Actor están creados con el asistente de búsqueda, y a estas
alturas creo que todo el mundo debería saber cómo. Las
tablas quedan relacionadas de la siguiente manera:

NUESTROS FORMULARIOS.
1ª Opción: Cuadro de lista:
A la hora de desarrollar el ejemplo, mi primer impulso fue trabajar con un cuadro de lista.
Entonces necesitamos un formulario (lo llamaré FCreditoLst) con un cuadro de lista
independiente (lo llamaré lstCreditos), con Origen de la fila en “lista de valores” , con una
única columna y Bloqueado: Sí.
A mí me ha quedado una cosa así:

Para ese alto de cuadro de lista, he comprobado que me cogen 20 filas, algo que hay que tener
en cuenta luego en el código.
La idea es crear y rellenar una colección, y luego traspasar los elementos de esa colección al

2
Visítame en http://neckkito.siliconproject.com.ar
cuadro de lista. También se podría hacer directamente en el cuadro de lista, pero luego es un
poco más lioso manejar el efecto…
Para crear y rellenar la colección, creamos el siguiente código en el
módulo del formulario:
Dim miColeccion As Collection
Dim i As Integer

Private Sub rellenaColeccion()


Dim rst As DAO.Recordset
Set miColeccion = New Collection
'Sé que el alto del cuadro de lista me da para 20 líneas, y añado esas líneas en blanco
For i = 1 To 20

miColeccion.Add ""
Next i
'Añado el "título", el director y algún texto y líneas en blanco para hacerlo bonito
Set rst = CurrentDb.OpenRecordset("SELECT * FROM TPeliculas WHERE ID=1")
miColeccion.Add UCase(rst("Titulo"))
miColeccion.Add ""
miColeccion.Add "DIRECTED BY"
miColeccion.Add CStr(rst("Director"))
miColeccion.Add ""
miColeccion.Add "CASTING"
'Recorro una consulta sobre las tablas TCasting y TActores y voy añadiendo los registros a la colección
Set rst = CurrentDb.OpenRecordset("SELECT TCasting.ID, TCasting.Pelicula, TActores.Actor, TCasting.Personaje
FROM TActores INNER JOIN TCasting ON TActores.IDActor = TCasting.Actor WHERE TCasting.Pelicula=1")
rst.MoveFirst
Do Until rst.EOF

miColeccion.Add rst("Actor") & " - " & rst("Personaje")

rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Sub

Como se puede ver no tiene nada de complicado: por medio del método Add, vamos
añadiendo elementos a la colección, teniendo en cuenta que cada elemento será una fila del
cuadro de lista.
Para rellenar el cuadro de lista, hacemos otro procedimiento, en el que recorreremos todos los
elementos de la colección, los pasamos al cuadro de lista con AddItem y lo recargamos:
Private Sub rellenaLista()
Me.lstCreditos.RowSource = ""
For i = 1 To miColeccion.Count

Me.lstCreditos.AddItem miColeccion(i)

Next i

3
Visítame en http://neckkito.siliconproject.com.ar
Me.lstCreditos.Requery
End Sub

Fijaos en cómo el cuadro de lista y la colección se manejan de


forma similar, con Add y AddItem.
El siguiente paso es programar el formulario, en concreto
los eventos “Al cargar”, “Al cronómetro” y “Al cerrar”:
Private Sub Form_Close()
Set miColeccion = Nothing
End Sub

Private Sub Form_Load()


rellenaColeccion
rellenaLista
Me.TimerInterval = 500
End Sub

Private Sub Form_Timer()


If miColeccion.Count > 0 Then

miColeccion.Remove 1

rellenaLista

Else

Me.TimerInterval = 0
End If
End Sub

En el evento “Al cargar”, llamamos a los procedimientos anteriores, para rellenar la colección y
pasarlo al cuadro de lista y activamos el intervalo de cronómetro, en el ejemplo, a medio
segundo (u otro valor que os guste más)
En el evento “Al cronómetro”, mientras haya elementos en la colección (If miColeccion.Count>0)
eliminamos el primer elemento (miColeccion.Remove 1) y rellenamos el cuadro de lista. Cuando la
colección quede vacía, paramos el cronómetro.

Y en el evento “Al cerrar” simplemente destruimos la colección.


Para terminar con esta primera opción comentaros un par de “inconvenientes”:
1º/ Al probar el código en distintos PCs y con distintas versiones, me encontré con que en
alguno (un Access 2013, concretamente), si no deshabilitaba el cuadro de lista (propiedad
Activado: No) no se veían bien las líneas. Por tanto, jugad con las propiedades Activado y
Bloqueado hasta dar con el efecto deseado.
2º/ Los “registros” aparecen alineados a la izquierda, con lo que el efecto “Créditos” se desluce
un poco. Para centrarlos en el cuadro de lista, podéis probar un código de Lebans que lo hace
por medio de APIs, o podéis seguir leyendo…
3º/ Con el campo “Director”, me encontré con que me saltaba un error al pasarle directamente
el valor a la colección (y desconozco el motivo), pero si le aplico la función CStr()
(miColeccion.Add CStr(rst("Director"))) funciona sin problema. Esto lo quiero señalar por si os pasa
algo parecido, que sepáis cómo solucionarlo

4
Visítame en http://neckkito.siliconproject.com.ar
2ª Opción: Cuadro de texto:
Para solucionar el problema del centrado, se me ocurrió
probar con un cuadro de texto. Si copiáis el formulario
anterior, lo renombráis como FCreditosTxt, lo abrís en Vista
Diseño y cambiáis el cuadro de lista por uno de texto (ver
imagen), las modificaciones en el código son mínimas.

Al cuadro de texto lo llamamos txtCreditos, lo ponemos con alineación centrada, y lo


bloqueamos (Bloqueado: Sí) para que no se vaya seleccionando su contenido. Y ya solamente
tenemos que modificar el procedimiento rellenaLista, que queda como sigue:
Private Sub rellenaLista()
Me.txtCreditos = ""
For i = 1 To miColeccion.Count

Me.txtCreditos = Me.txtCreditos & miColeccion(i) & Chr(13) & Chr(10)

Next i
End Sub

3ª Opción: Rizando el rizo.


¿Y si en vez de tener un efecto de “abajo a arriba” como los títulos de una película lo queremos
de “arriba a abajo” como en Matrix?
Pues no hay problema: duplicamos FCreditosTxt y lo llamamos FCreditosTxtDown y
modificamos los procedimientos rellenaColeccion y rellenaLista que quedan así:

Private Sub rellenaColeccion()


Dim rst As DAO.Recordset
Set miColeccion = New Collection
'Añado el "título", el director y algún texto y líneas en blanco para hacerlo bonito
Set rst = CurrentDb.OpenRecordset("SELECT * FROM TPeliculas WHERE ID=1")
miColeccion.Add UCase(rst("Titulo"))
miColeccion.Add ""
miColeccion.Add "DIRECTED BY"
miColeccion.Add CStr(rst("Director"))
miColeccion.Add ""
miColeccion.Add "CASTING"
'Recorro una consulta sobre las tablas TCasting y TActores y voy añadiendo los registros a la colección

5
Visítame en http://neckkito.siliconproject.com.ar
Set rst = CurrentDb.OpenRecordset("SELECT TCasting.ID, TCasting.Pelicula, TActores.Actor, TCasting.Personaje
FROM TActores " _

& "INNER JOIN TCasting ON TActores.IDActor = TCasting.Actor WHERE


TCasting.Pelicula=1")
rst.MoveFirst
Do Until rst.EOF

miColeccion.Add rst("Actor") & " - " & rst("Personaje")

rst.MoveNext
Loop
'Añado unas líneas en blanco para que desaparezca el texto
For i = 1 To 25

miColeccion.Add ""

Next i
rst.Close
Set rst = Nothing
End Sub

Private Sub rellenaLista()


If miColeccion.Count > 0 Then Me.txtCreditos = miColeccion(1) & Chr(13) & Chr(10) & Me.txtCreditos
End Sub

¡Y esto es todo, amigos! J

6
Visítame en http://neckkito.siliconproject.com.ar

También podría gustarte