Cómo mostrar imágenes de una carpeta en un formulario, un informe o una página de acceso a datos

Nota

Office 365 ProPlus pasa a llamarse Microsoft 365 Apps para empresas. Para obtener más información sobre este cambio, lea esta publicación de blog.

Número de KB original:   285820

Nota

Requiere conocimientos expertos de codificación, interoperabilidad y multiusuario. Este artículo se aplica a una base de datos de Microsoft Access (. mdb/. accdb) y a un proyecto de Microsoft Access (. ADP).

Resumen

A veces, no es práctico almacenar imágenes en una tabla de Microsoft Access. Si tiene muchas imágenes o si cada uno de los archivos de imagen es grande, el tamaño del archivo de base de datos de Microsoft Access puede aumentar rápidamente.

En este artículo se muestra una función personalizada que puede usar para:

  • Almacenar las rutas de archivo y los nombres de las imágenes de una tabla.
  • Mostrar imágenes mediante un control de imagen.
  • Oculte el control de imagen si no hay ninguna imagen disponible.
  • Proporcionar comentarios sobre el estado de visualización de la imagen.

Este artículo también contiene script de Visual Basic de ejemplo que puede usar para mostrar las imágenes en una página de acceso a datos.

Nota

Aunque en este ejemplo se usan imágenes de mapa de bits (. bmp), también puede usar otros tipos de imagen, como. jpg,. PCX y. gif.

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía, ya sea expresa o implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. Se considera que está familiarizado con el lenguaje de programación que se muestra y con las herramientas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos adaptados a sus necesidades específicas.

Creación de la tabla para almacenar datos de archivos y rutas de acceso

  1. Abra la base de datos de ejemplo, Northwind. mdb, o el proyecto de ejemplo, NorthwindCS. adp.

  2. Cree la siguiente tabla en Northwind. mdb o en NorthwindCS. adp.

    En Northwind. mdb:

    Table: tblImage
    ----------------------------
    Field Name: ImageID
    Data Type: AutoNumber
    Indexed: Yes (No Duplicates)
    
    Field Name: txtImageName
    Data Type: Text
    
    Table Properties: tblImage
    --------------------------
    PrimaryKey: ImageID
    

    En NorthwindCS. adp:

    Table: tblImage
    -----------------------
    Column Name: ImageID
    Datatype: Int
    Allow Nulls: Unchecked
    Identity: Yes
    
    Column Name: txtImageName
    Datatype: varchar
    
    Table Properties: ImageTable
    -------------------------------
    Primary Key Constraint: ImageID
    
  3. Abra la tabla tblImage en la vista Hoja de información y, a continuación, agregue la ruta de acceso y el nombre de un archivo de mapa de bits a cada registro. En la siguiente tabla de ejemplos se muestra el aspecto que podrían tener los registros:

    Tipo Ejemplo
    Absoluta (local) C:\Windows\Zapotec.bmp
    Absoluta (ruta UNC) \\Servername\sharename\Zapotec.bmp
    Relative Zapotec. bmp

Creación de la función personalizada

  1. Cree un nuevo módulo y, a continuación, pegue o escriba el siguiente código:

    Option Compare Database
    Option Explicit
    
    Public Function DisplayImage(ctlImageControl As Control, strImagePath As Variant) As String
    On Error GoTo Err_DisplayImage
    
    Dim strResult As String
    Dim strDatabasePath As String
    Dim intSlashLocation As Integer
    
    With ctlImageControl
     If IsNull(strImagePath) Then
         .Visible = False
         strResult = "No image name specified."
     Else
         If InStr(1, strImagePath, "\") = 0 Then
             ' Path is relative
             strDatabasePath = CurrentProject.FullName
             intSlashLocation = InStrRev(strDatabasePath, "\", Len(strDatabasePath))
             strDatabasePath = Left(strDatabasePath, intSlashLocation)
             strImagePath = strDatabasePath & strImagePath
         End If
         .Visible = True
         .Picture = strImagePath
         strResult = "Image found and displayed."
     End If
    End With
    
    Exit_DisplayImage:
     DisplayImage = strResult
     Exit Function
    
    Err_DisplayImage:
     Select Case Err.Number
         Case 2220       ' Can't find the picture.
             ctlImageControl.Visible = False
             strResult = "Can't find image in the specified name."
             Resume Exit_DisplayImage:
         Case Else       ' Some other error.
             MsgBox Err.Number & " " & Err.Description
             strResult = "An error occurred displaying image."
             Resume Exit_DisplayImage:
     End Select
    End Function
    
  2. Guarde el módulo como Module1.

Uso de la función personalizada en un formulario

  1. Cree el siguiente formulario nuevo que se base en la tabla tblImage.

    Form: frmImage
    ----------------------
    Caption: Image Form
    RecordSource: tblImage
    
    Image Control
    ---------------------------------
    Name: ImageFrame
    Picture: "C:\Windows\Zapotec.bmp"
    
    Text box
    ----------------------
    Name: txtImageID
    ControlSource: ImageID
    
    Text box
    ---------------------------
    Name: txtImageName
    ControlSource: txtImageName
    
    Text box
    ---------------------------
    Name: txtImageNote
    ControlSource: <Blank>
    

    Nota

    Si no desea que la ruta de acceso aparezca en el formulario, puede establecer la Visible propiedad del txtImageName control en false.

  2. En el menú Ver , haga clic en códigoy, a continuación, pegue o escriba el siguiente código:

    Option Compare Database
    Option Explicit
    
    Private Sub Form_AfterUpdate()
     CallDisplayImage
    End Sub
    
    Private Sub Form_Current()
     CallDisplayImage
    End Sub
    
    Private Sub txtImageName_AfterUpdate()
     CallDisplayImage
    End Sub
    
    Private Sub CallDisplayImage()
     Me!txtImageNote = DisplayImage(Me!ImageFrame, Me!txtImageName)
    End Sub
    
  3. Abra el formulario frmImage en la vista formulario. Tenga en cuenta que el formulario muestra el mapa de bits correspondiente para cada registro. Si el txtImageName campo está en blanco o no se encuentra la imagen, recibirá los mensajes apropiados en lugar del marco de imagen.

Uso de la función personalizada en un informe

  1. Cree el siguiente informe nuevo basado en la tabla ImageTable.

    Report: rptImage
    ----------------------
    Caption: Image Report
    RecordSource: tblImage
    
    Image Control
    ---------------------------------
    Name: ImageFrame
    Picture: "C:\Windows\Zapotec.bmp"
    
    Text box
    ----------------------
    Name: txtImageID
    ControlSource: ImageID
    
    Text box
    ---------------------------
    Name: txtImageName
    ControlSource: txtImageName
    
    Text box
    ---------------------------
    Name: txtImageNote
    ControlSource: <Blank>
    

    Nota

    Si no desea que la ruta de acceso aparezca en el informe, puede establecer la Visible propiedad del txtImageName control en false.

  2. En el menú Ver , haga clic en códigoy, a continuación, pegue o escriba el siguiente código:

    Option Compare Database
    Option Explicit
    
    Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
     Me!txtImageNote = DisplayImage(Me!ImageFrame, Me!txtImageName)
    End Sub
    
  3. Abra el informe rptImage en la vista previa de impresión. Tenga en cuenta que el informe muestra el mapa de bits correspondiente para cada registro. Si el txtImageName campo está en blanco o no se encuentra la imagen, recibirá los mensajes apropiados en lugar del marco de imagen.

Duplicar la función personalizada en una página de acceso a datos

  1. Cree la siguiente página de acceso a datos nueva basada en la tabla tblImage.

    Data Access Page: dapImage
    -----------------------------
    Title: Image Data Access Page
    
    Image Control
    ---------------------------------
    ID: ImageFrame
    
    Text box
    ----------------------
    ID: txtImageID
    ControlSource: ImageID
    
    Text box
    ---------------------------
    ID: txtImageName
    ControlSource: txtImageName
    

    Nota

    Si no desea que la ruta de acceso aparezca en la página, puede establecer la Visibility propiedad del txtImageName control en Hidden.

  2. En el menú herramientas , elija macrosy, a continuación, haga clic en Editor de secuencias de comandos de Microsoft.

  3. Agregue el siguiente script al evento Current del MSODSC en la etiqueta HEAD del documento HTML.

    Nota

    Debe pasar un parámetro en orden para que se desencadene el evento.

    <SCRIPT language=vbscript event=Current(oEventInfo) for=MSODSC>
    <!--
    ImageFrame.src=txtImageName.value
    -->
    </SCRIPT>
    
  4. Abra la página dapImage en la vista Página. Tenga en cuenta que la página muestra el mapa de bits correspondiente para cada registro. Si el campo txtImageName está en blanco, se muestra un icono de control. Si no se encuentra la imagen, aparece un icono X en el control Image.

Usar una ruta de acceso de http://en un formulario

Para usar una ruta de acceso de http://en un formulario, use el control del explorador Web (shdocvw. dll) de la siguiente manera:

  1. Agregue un control de explorador Web de Microsoft al formulario y asígnele el nombre WebBrowser.

  2. Agregue el código siguiente a un módulo:

    Public Function DisplayImageWeb(ctlBrowserControl As Control, _
    strImagePath As Variant)
    
    On Error GoTo Err_DisplayImage
    
    Dim strDatabasePath As String
    Dim intSlashLocation As Integer
    
    With ctlBrowserControl
     If IsNull(strImagePath) Then
     ElseIf Left(strImagePath, 4) = "http" Then
         .Navigate (strImagePath)
     Else
         If InStr(1, strImagePath, "\") = 0 Then
             ' Path is relative
             strDatabasePath = CurrentProject.FullName
             intSlashLocation = InStrRev(strDatabasePath, "\", Len(strDatabasePath))
             strDatabasePath = Left(strDatabasePath, intSlashLocation)
             strImagePath = strDatabasePath & strImagePath
         End If
         .Navigate (strImagePath)
     End If
    End With
    
    Exit_DisplayImage:
     Exit Function
    
    Err_DisplayImage:
     Select Case Err.Number
         Case Else
             MsgBox Err.Number & " " & Err.Description
             Resume Exit_DisplayImage:
     End Select
    End Function
    
  3. Agregue el código siguiente detrás del formulario:

    Option Compare Database
    Option Explicit
    
    Private Sub Form_AfterUpdate()
     CallDisplayImage
    End Sub
    
    Private Sub Form_Current()
     CallDisplayImage
    End Sub
    
    Private Sub txtImageName_AfterUpdate()
     CallDisplayImage
    End Sub
    
    Private Sub CallDisplayImage()
     DisplayImageWeb Me.WebBrowser9, Me.txtImageName
    End Sub