Anda di halaman 1dari 7

IMÁGENES EN FORMULARIOS Y

FORMULARIOS CONTINUOS - EVOLUTION1

Bueno, bueno… Ya sé que en la web tenemos unos


magníficos (je, je…) ejemplos de cómo mostrar imágenes
en formulario (aquí o aquí), pero aquí os traigo un ejemplo
que aprovecha una característica de los cuadros de imagen
incorporada desde Access 2007.

Cierto es que quizá debería haber escrito este artículo un


poco antes (ji, ji…) pero… “no se puede estar en todo” ;-)

Dicho esto os comento que voy a dividir este ejemplo en cuatro partes:

1.- La primera (y fácil), sobre cómo mostrar una imagen en un formulario.


2.- La segunda (y fácil), sobre cómo mostrar imágenes en formularios continuos.
3.- La tercera (y un poco menos fácil simplemente porque hay VBA de por medio), que nos
permitirá insertar imágenes con rutas relativas. Pero, en definitiva, si se entienden los puntos
1 y 2 no deberíais tener ningún problema en entender esta tercera parte.
4.- La cuarta, ligada a la tercera, donde os explicaré un sistema para seleccionar la imagen.

Para que la BD no nos “engorde” lo que vamos a guardar, realmente, es la ruta de la imagen,
dado que para los puntos 1 y 2 utilizaremos rutas absolutas; en los puntos 3 y 4 utilizaremos
rutas relativas.

Creo que la cosa esta clara (¿creo bien?), así que vamos a poner manos a la obra… ¡ya! Pero
antes…

POR SI ALGUIEN NO SABE LO QUE ES UNA RUTA ABSOLUTA


Y UNA RUTA RELATIVA
A los efectos de este ejemplo voy a poner, nunca mejor dicho, un ejemplo para clarificar los
anteriores conceptos.

Imaginemos que estamos trabajando en un PC con las imágenes en


“C:\DatosRecopilados\Imagenes\”

Si estamos indicando que las imágenes están siempre en esa ruta, y de ahí no se van a mover,
estamos trabajando con rutas absolutas. Le estamos diciendo a Access que “búscame siempre
la imagen X que está en la carpeta <<Imagenes>>, que a su vez está en la carpeta
<<DatosRecopilados>>, que a su vez está en la unidad <<C>>”.

Ahora imaginemos que tenemos las imágenes en un pen. Enchufamos ese pen a nuestro PC y
obtenemos la ruta “F:\DatosRecopilados\Imagenes\”.

Si utilizamos rutas absolutas podríamos tener un problema, dado que si ese mismo pen lo
conectamos a otro PC y este nos asigna la letra de unidad “G”, para nuestro pen las imágenes
ya habrán cambiado su ruta por “G:\DatosRecopilados\Imagenes\”

Consecuencia: Access, que buscará en F (y ni siquiera sabe que existe G), no va a encontrar
las imágenes.

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

1
Visítame en http://neckkito.siliconproject.com.ar
Para soslayar los inconvenientes de este último caso
utilizaremos una ruta relativa, y relativa en relación a dónde
esté situado nuestro Access. Así pues, si tenemos nuestra
base de datos en la carpeta <<DatosRecopilados>> lo que
le diríamos a Access sería “busca la imagen X que está en la
carpeta <<Imagenes>>, que está en la misma carpeta
donde está la base de datos”.

Con esta última expresión ya no hacemos referencia a


letras de unidad ni carpetas anteriores, con lo cual nos da
igual si la letra de unidad es C o es Z.

Creo que con esto deberíamos entender la diferencia entre


rutas absolutas y rutas relativas.

NUESTRA TABLA
La tabla puede ser la que queramos, pero para almacenar la ruta de la imagen vamos a tener
que crear un campo de tipo texto o memo (texto largo) para guardar dicha ruta. Para este
ejemplo yo me he creado esta simple tabla:

PARTE 1

NUESTRO FORMULARIO
Sobre la anterior tabla nos creamos un formulario, que yo llamaré FDatos.

Situamos FDatos en vista diseño y añadimos un control imagen.

Nos pedirá el asistente que seleccionemos una imagen. Seleccionamos cualquiera que
tengamos a mano.

Sacamos las propiedades de ese control imagen → Formato → Imagen, y borramos el valor que
se haya establecido.

2
Visítame en http://neckkito.siliconproject.com.ar
Siguiendo en las propiedades de ese control imagen → Datos → Origen del control, ahí
seleccionamos en el desplegable el nombre del campo que contiene la ruta de la imagen; esto
es, [RutaImagen]

Y listo. Así de fácil.

Cuando situemos nuestro formulario en vista formulario y rellenemos el campo [RutaImagen]


automáticamente se nos mostrará la imagen seleccionada. Si el valor de ese campo no fuera
válido simplemente no nos mostraría nada.

PARTE 2

NUESTRO FORMULARIO CONTINUO


El proceso para ver las imágenes en un formulario continuo es exactamente el mismo. La única
diferencia es que, cuando creemos el formulario sobre la tabla, tenemos que indicarle que lo
que queremos en un formulario continuo (varios elementos).

Resumiendo, y en ese formulario continuo:

 Añadimos un control imagen


 Le quitamos el valor de la imagen que hayamos seleccionado
 Le decimos que el origen del control es el campo que contiene la ruta de la imagen.

¿Fácil, verdad?

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

NUESTRO FORM (CONTINUO O NO) USANDO RUTAS


RELATIVAS
Como comentábamos al principio, y suponiendo que las imágenes están en la carpeta
<<Imagenes>>, que a su vez está en la carpeta donde está nuestro Access, ya no debemos
preocuparnos de la ruta completa, dado que precisamente partimos “desde donde está
Access...”.

¿Qué le faltará saber a Access? Pues lo único que le faltará saber, para cada registro, es el
nombre de la imagen y su extensión.

Conclusión: nuestro campo [RutaImagen] deberá recoger nombre y extensión de la imagen.

En este ejemplo he duplicado la tabla TDatos, llamándola TDatos2, con los mismos campos.

A continuación nos creamos un formulario (o un formulario continuo) sobre la tabla, formulario


que yo he llamado FDatos2.

¿Qué hacemos en FDatos2? Pues seguimos los mismos pasos que explicábamos en la parte 1,
exceptuando el último. Es decir:

1.- Insertamos un control imagen


2.- Le eliminamos la imagen de origen (Propiedades → Formato → Imagen).

Ahora, como origen del control, no le podemos poner el campo [RutaImagen], dado que ahora
ese campos solo va a contener el nombre y extensión de la imagen. Entonces, ¿cómo lo
hacemos?

Vamos a dejar por el momento ese punto como incógnita pasemos a prepararnos el terreno
para poder solventar ese problemilla.

4
Visítame en http://neckkito.siliconproject.com.ar
CREÁNDONOS UN MÓDULO
Lo que haremos será insertar un módulo estándar 2, que
llamaremos mdlRutaImagenes. En ese módulo nos vamos a
crear una función personalizada que nos devolverá la ruta
relativa sólo hasta la carpeta imágenes.

Así pues, insertamos el siguiente código:


Public Function fncRutaCarpetaImg() As String
Const nombreCarpetaImagenes As String = "Imagenes"
'Simplemente creamos la ruta relativa a la carpeta de imágenes, que será
'el valor que nos devolverá la función
fncRutaCarpetaImg = CurrentProject.Path & "\" & nombreCarpetaImagenes & "\"
End Function

Si os fijáis he creado la función usando una constante, cuyo valor es el que debéis cambiar si
vuestra carpeta de imágenes se llama de otra manera.

Por ejemplo, si se llamara “Imgs” pues os bastaría cambiar la línea:

Const nombreCarpetaImagenes As String = "Imagenes"

por

Const nombreCarpetaImagenes As String = "Imgs"

De la misma manera, si la carpeta de imágenes estuviera en una subcarpeta, habría que


indicarlo ahí. Por ejemplo, si la ruta fuera:

<<Carpeta donde está la BD\Documentacion\ImagenesProyectos>>

deberíais escribir

Const nombreCarpetaImagenes As String = "Documentacion\ImagenesProyectos"

Y con esto ya tenemos nuestro “chivato de ruta relativa” preparado.

VOLVIENDO AL FORMULARIO (O SUBFORMULARIO)


Pues lo dicho: volvamos a FDatos2. Sacamos las propiedades del control imagen → Datos →
Origen del control, y ahí escribimos:

=fncRutaCarpetaImg() & [RutaImagen]

Y con eso… nuestra imagen con rutas relativas… ¡voilà!

2 Para insertar un módulo estándar podemos abrir el editor de VB (ALT+F11) y nos vamos a Menú > Insertar > Módulo

5
Visítame en http://neckkito.siliconproject.com.ar
PARTE 4

ELIJO LA IMAGEN “A LO
PROFESIONAL”
Vamos a partir del formulario que nos hemos creado en la
parte 3, que a efectos de este ejemplo yo llamaré FDatos4
(por hacerlo cuadrar con la “parte 4”… je, je…).

Lo primero que vamos a hacer va a ser añadir un nuevo


módulo estándar, que llamaremos mdlSeleccionaImg.

Si no la tenemos registrada, vamos a registrar la referencia “Microsoft Office x.y Object


Library”, donde x.y se corresponderá con la versión de Office que tengamos instalada en
nuestro ordenador3.

En ese módulo escribimos el siguiente código:


Public Function fncBuscaImagen() As String
'Requiere registro de la referencia Microsoft Office x.y Object Library

Dim imagenSeleccionada As String


Dim puntoCorte As Integer
Dim fDialog As Office.FileDialog

Set fDialog = Application.FileDialog(msoFileDialogFilePicker)

With fDialog
.AllowMultiSelect = False
.ButtonName = "Seleccionar"
.Title = "Seleccionar la imagen"
.InitialFileName = Application.CurrentProject.Path
.InitialView = msoFileDialogViewDetails
.Filters.Clear
.Filters.Add "Archivos de imagen", "*.jpg; *.png; *.bmp"
.Filters.Add "Todos los archivos", "*.*"
If .Show = True Then
imagenSeleccionada = .SelectedItems(1)
Else
MsgBox "La selección de imagen se ha cancelado", vbExclamation, "CANCELADO"
End If
End With

puntoCorte = InStrRev(imagenSeleccionada, "\")


fncBuscaImagen = Right(imagenSeleccionada, Len(imagenSeleccionada) - puntoCorte)
End Function

Simplemente destacar que para poder coger sólo el nombre de la imagen más la extensión,
dado que la línea (imagenSeleccionada = .SelectedItems(1)) lo que hace es devolvernos la ruta
completa desde la letra de la unidad, utilizamos las variable “puntoCorte”, a través de la
función InStrRev(), para saber dónde está la última barra invertida y, desde ahí, la función
right() nos permite elegir, de esa ruta, la parte que nos interesa (que es, obviamente, el
nombre de la imagen y su extensión).

¿Y si estoy utilizando el sistema de rutas absolutas? Pues simplemente, a nuestro código


anterior, habría que hacerle un pequeño cambio, que consistiría en sustituir estas dos líneas:

3 Para registrar una referencia debemos irnos, en el editor de VB, a Menú > Herramientas > Referencias... Se nos abrirá una
ventana mostrándonos todas las referencias disponibles. Buscamos la que nos interese, marcamos su check y aceptamos.

6
Visítame en http://neckkito.siliconproject.com.ar
puntoCorte = InStrRev(imagenSeleccionada, "\")
fncBuscaImagen = Right(imagenSeleccionada, Len(imagenSeleccionada) - puntoCorte)

por esta otra:

fncBuscaImagen = imagenSeleccionada

Y asunto arreglado :-)

Volvamos a FDatos4. Ahí lo que nos queda por hacer es


insertar un botón de comando, lo llamamos
cmdBuscaImagen4 y en su evento “Al hacer clic” le
generamos este simple código5:


Private Sub cmdBuscaImagen_Click()
Me.RutaImagen.Value = fncBuscaImagen
End Sub

Y listos!!!!!

Como nota añadir, simplemente, que si no nos gusta que se vea el nombre del archivo
podemos sacar las propiedades del campo [RutaImagen] → Pestaña formato → Visible, y
situamos esa propiedad en NO.

PARA FINALIZAR EL EJEMPLO


Bueno… He intentado ir de lo fácil a lo más complejo, dando por sentado que si entendíais una
fase la siguiente prácticamente no tendría mayor dificultad. Espero haber conseguido ese
objetivo.

¡Pues eso es to, eso es to, eso es todo, amigos!!!! ;-)

Un saludo, y…

¡suerte!

4 Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaña > Otras >
Nombre. Ahí escribimos el nombre que queramos.
5 Para generar código debemos sacar las propiedades del control > Pestaña Eventos, y nos situamos en la parte “blanca” a la
derecha del evento que queremos programar. Veremos un pequeño botón de puntos suspensivos. Si hacemos clic sobre él nos
aparecerá una ventana que nos pedirá qué operación deseamos realizar. Le indicamos que queremos “generar código”.

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

Anda mungkin juga menyukai