Mostrar imagen en grande haciendo doble click en un cuadro "Imagen" de una Base de Datos de Access

Desde hace muchos años, soy un apasionado de las bases de datos, y más concretamente, las bases de datos de Access. Pero hay un tema que no consigo resolver:
En un formulario voy cargando imágenes vinculadas en un cuadro de imagen, con un código de visual basic tanto para el cuadro de imagen (para buscar la imagen en una ruta concreta al hacer doble click) como al cargar el formulario (para indicar qué imagen cargar en cada página de formulario, ya que son todas diferentes, y especificar de dónde se tiene que coger ese dato, en mi caso de un cuadro de texto de la tabla origen donde se almacena el nombre de la imagen para cada página). Ahora bien, en otro formulario, que apunta a la misma tabla de datos que el anterior, pero con la diferencia que éste es en el que se consultan los datos (el anterior es solo para introducirlos por diferentes campos que no se muestran a simple vista), me gustaría que al hacer doble click en el cuadro de imagen se mostrara la imagen con el visor de imágenes predeterminado de windows o de cualquier otra forma en tamaño grande.
No sé si lo que pido es muy complicado, tal vez no, pero yo nunca he sido un experto en programación; de hecho, aunque he estudiado Visual Basic, no es una cosa que se me dé del todo bien; pero en mis bases de datos siempre he puesto algunos módulos, normalmente buscándolos por internet y modificando yo lo necesario en cada momento; pero en este caso, no encuentro el modo de hacerlo.

3 respuestas

Respuesta
1

Francisco, podrías ponerlo en las propiedad es del control imagen-Eventos-Al mover el mouse, es decir, al pasar el cursor sobre él, pero... contestando a lo que dices, si tengo un formulario con un control imagen Imagen16

Si hago doble clic sobre él

En este caso, en el evento Al hacer doble clic del control le digo

Private Sub Imagen16_DblClick(Cancel As Integer)
Imagen16.Width = 8 * 570
Imagen16.Height = 8 * 570
End Sub

O sea, le doy el tamaño de alto y de ancho que yo quiera. Lo de 570 son los twips que hay en un centímetro. En vez de 8 por el número que quieras.

Gracias por la rápida respuesta, Julián, pero no es exactamente lo que quiero... Ese formulario del que hablo hace la función de subformulario dentro de otro, y con esa opción solo se vería la parte superior izquierda de la imagen; tal vez me interesaría más que se abriera la imagen en una ventana diferente. Te explico, ya que tal vez no me expliqué del todo bien, para ver si me puedes ayudar:
Yo ya tengo cargadas más de 2000 imágenes de portadas (es una base de datos de Cómics) en ese formulario, pero están en un campo de la tabla de origen de "datos adjuntos", ya que fue la única forma que encontré en su día para poder cargarlas sin ponerme a buscar códigos. El problema es que al estar incrustada la imagen, la base de datos me "pesa" ya casi dos gigas, y teniendo en cuenta que tal vez me queden por poner unas mil más, pues me he puesto a buscar la opción de vincular las imágenes. A lo que iba, con ese campo de "datos adjuntos", si le das doble click a la imagen se puede, entre alguna otra opción, cargar la imagen y verla con el visor de imágenes de Windows; eso es, aunque no sé si es posible, más o menos lo que estoy buscando.
Gracias de nuevo por tu tiempo y tu respuesta!

Es que lo puedes hacer de muchas formas. Por ejemplo, tengo el formulario Ventas, con un subformulario DetalleVenta y otro subformulario Formulario1, donde selecciono el producto que voy a vender.

Si hago doble clic sobre una imagen( por ejemplo, la de la izquierda se llama A1).

Me abre el formulario Formulario2 en vista diálogo, que tiene un control de imagen llamado Imagen0.

En este caso, repito, en este caso, ya que no sé la estructura ni como tienes construido el(los) formulario(s), ni donde están las rutas a dichas imágenes, en el evento Al hacer doble clic del control imagen del formulario1 le digo

Private Sub A1_Click()
DoCmd.OpenForm "formulario2", , , , , acDialog
End Sub

y en el evento Al abrir del formulario2 le digo

Private Sub Form_Open(Cancel As Integer)
Imagen0.Picture = Forms!ventas!Formulario1.Form!A1.Picture
End Sub

Pero ya te digo que esto es una aproximación. Lo ideal sería poner algo como

If currentproject.allforms("ventas").isloaded then

...

Como dije en el primer mensaje, en el formulario donde voy cargando las imágenes, he creado un campo de "Imagen" donde al hacer doble click voy cargando las imágenes; y al activar registro ya le especifico que la ruta de la imagen que tiene que cargar está en un cuadro de texto, que he creado en la tabla de origen para sustituir el campo de "datos adjuntos", donde se guarda el nombre de la imagen cada vez que la cargo en el campo "Imagen" de cada página del formulario. Y en este segundo formulario, que apunta a la misma tabla, es donde quiero que se pueda ampliar la imagen ya que queda a un tamaño bastante reducido, al haber muchos datos en él (voy a intentar subir una captura de pantalla). Ambos formularios están en el modo de "Formularios continuos"
Muchas gracias de nuevo y perdón por las molestias.

Sigo insistiendo en lo de la estructura. Por ejemplo, yo tengo una tabla Imagenes con los campos A1, A2,... donde, por lo que parece en la imagen que pones, sólo guardas el nombre del archivo de imagen. Bien, yo tengo una carpeta donde guardo unas imágenes. Si tengo el formulario Imagenes continuo

Le he añadido un cuadro de texto al que se podría poner como oculto y darle un tamaño mínimo, aunque personalmente creo que deberíamos usar una variable.

Si hago doble clic sobre A1, me abre el formulario2 que tiene un control imagen llamado Imagen0

Si hago dobleclic sobre CC2.jpg

Si hago dobleclic sobre CC3.jpg

Puedes ver que en texto12 muestra la ruta completa a ese archivo en particular. Luego cuando se cierra el formulario2 se borra.

En este caso, en el evento Al hacer doble clic de control A1 le digo

Private Sub A1_DblClick(Cancel As Integer)
Texto13 = "C:\users\gonza\documentos\imagenesusar\" & A1
DoCmd.OpenForm "formulario2", , , , , acDialog
End Sub

Lo mismo para los demás controles.

Y en el evento Al abrir del formulario2  le digo

Private Sub Form_Open(Cancel As Integer)
Imagen0.Picture = Forms!imagenes!Texto13
End Sub

Y en el evento Al cerrar del formulario2

Private Sub Form_Close()
Forms!imagenes!Texto13 = Null
End Sub

Al final, gracias a tu idea aunque modificándola un poco, lo he solucionado, o al menos he conseguido que me haga lo que quiero.

Te explico como lo tengo, ya que es una base de datos complicada:
Buscando por internet conseguí un par de códigos, que modifiqué para adaptarlos a mi base de datos, uno para al hacer doble click en el cuadro de imagen donde tienen que cargarse las portadas, que antes de modificarlo yo era este:

Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
Dim SeleccionaElemento As Variant
With fd
.Filters.Clear
.AllowMultiSelect = False
.InitialFileName = CurrentProject.Path & "\img"
.Filters.Add "Todos los Archivos", "*.*"
.Filters.Add "Images", "*.gif; *.jpg; *.jpeg; *.BMP", 1
If .Show = -1 Then
For Each SeleccionaElemento In .SelectedItems
Me.Imagen.Picture = Dir(SeleccionaElemento)
Me.txtNombreFoto.Value = Mid(SeleccionaElemento, (IIf(InStrRev(SeleccionaElemento, ":") > InStrRev(SeleccionaElemento, "\"), InStrRev(SeleccionaElemento, ":"), InStrRev(SeleccionaElemento, "\")) + 1))
DoCmd.RunCommand acCmdRefresh
Next SeleccionaElemento
Else
End If
End With
Set fd = Nothing
Exit Sub

Y otro para incluir al activar registro del formulario, que también antes de modificarlo era éste:

If Me.NewRecord Then
Dim NombreFoto As Variant ''nombre de la foto del usuario
Dim rutaFoto As String ''Ruta de la foto del usuario
Me.Imagen.Picture = "" ''dejamos sin imagen
rutaFoto = Application.CurrentProject.Path & "\img\SinFoto.jpg" ''definimos la ruta de la foto
Me.Imagen.Picture = rutaFoto ''asignamos la ruta que tiene la foto
Me.Refresh
Else
If Me.txtNombreFoto.Value = "" Or IsNull(Me.txtNombreFoto.Value) Or Me.txtNombreFoto.Value = "SinFoto.jpg" Then
MsgBox "Este Estudiante NO TIENE asignada FOTOGRAFÍA, debes hacerle una.", vbInformation, "Aviso.."
Me.Imagen.Picture = ""
NombreFoto = Me.txtNombreFoto.Value
rutaFoto = Application.CurrentProject.Path & "\img\SinFoto.jpg"
Me.Imagen.Picture = rutaFoto
Me.Refresh
Else
NombreFoto = Me.txtNombreFoto.Value
rutaFoto = Application.CurrentProject.Path & "\img\" & NombreFoto
Me.Imagen.Picture = rutaFoto
Me.Imagen.Requery
Me.Refresh
End If
End If
End Sub

Por lo que ves, el nombre y la ruta de la imagen, solo se guarda en el un cuadro de texto, oculto en el formulario, que apunta a la tabla origen de los datos, y es el que le indica, con estos códigos, qué imagen cargar en el cuadro de imagen.
Y lo he solucionado, que no sé si es la mejor manera, haciendo un nuevo formulario; en el cual, incluyo también un cuadro de imagen y le digo que, al hacer doble click sobre ella, la haga coincidir con el id del formulario donde están los datos, te enseño cual es:

Private Sub PortadaComic_DblClick(Cancel As Integer)
DoCmd.OpenForm "fPortada", acNormal
DoCmd.GoToRecord , "fPortada", acGoTo, IdComics
End Sub

Y así, al menos, aunque repito, no sé si es la mejor forma, he conseguido lo que quiero. Por favor, dime si lo he hecho bien o me he complicado mucho la vida ;-)
Desde luego sin tu ayuda me hubiera sido bastante complicado, porque no sabía por donde empezar, así que de nuevo muchas gracias!

Respuesta
1

Le dejo este link si quiere algo avanzado

https://youtu.be/X4XbbULG6CI 

¡Gracias! Aunque es una opción interesante, mi base de datos es completamente offline, sin usar servidores. De todas maneras, ya investigaré más en el tema.
Gracias de nuevo por su tiempo y su respuesta.

Respuesta
1

Hay por lo menos dos posibles líneas de actuación:

.- Una ==> ampliar el contenedor de la imagen (los límites: el tamaño de la sección)
.- Otra (a explorar) ==>  mantener el tamaño del contenedor y hacer Zoom sobre la imagen.

Nunca he experimentado el control Zoom fuera de su aplicación sobre los informes, pero si la curiosidad rebasa el limite, es una forma de mantenerla a raya.

Gracias por la respuesta!

Ese formulario del que hablo hace la función de subformulario dentro de otro, y con esa opción solo se vería la parte superior izquierda de la imagen; tal vez me interesaría más que se abriera la imagen en una ventana diferente. Le explico, ya que tal vez no me expliqué del todo bien:

Yo ya tengo cargadas más de 2000 imágenes en ese formulario, pero están en un campo de la tabla de origen de "datos adjuntos", ya que fue la única forma que encontré en su día para poder cargarlas sin ponerme a buscar códigos. El problema es que al estar incrustada la imagen, la base de datos me "pesa" ya casi dos gigas, y teniendo en cuenta que tal vez me queden por poner unas mil más, pues me he puesto a buscar la opción de vincular las imágenes. A lo que iba, con ese campo de "datos adjuntos", si le das doble click a la imagen se puede, entre alguna otra opción, cargar la imagen y verla con el visor de imágenes de Windows; eso es, aunque no sé si es posible, más o menos lo que estoy buscando; sobre todo para ver la imagen en grande, ya que en ese subformulario, al haber otros muchos datos y estar dentro de otro formulario, la imagen se ve en pequeño y me interesaría poder ampliarla para verla bien.
Gracias de nuevo.

Personalmente solo 'cargaría' en la base un mínimo de imágenes comunes y compartidas (lo permite Access desde la versión 2010 y su Recordset2).

Para el resto, solo se necesita la dirección de la imagen (en una carpeta subordinada lo hace muy cómodo) y el numero de imágenes máximo que admitirá seria el de la suma de todos sus nombres sin sobrepasar los dos gigabites.

Si se abre en una ventana independiente (un formulario exprofeso) la forma mas sencilla consiste en añadirle un par de botones (mas bonito con una barra deslizante) y cambiar el tamaño del contenedor de la imagen e incluso el del formulario que contiene ese control de imagen.

Solo resta evaluar si el esfuerzo merece la pena (hay un dicho popular que dice 'sarna con gusto no pica').

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas