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

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 resulta 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:

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

Este artículo también contiene un 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 archivo y ruta de acceso

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

  2. Cree la tabla siguiente 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 datos y agregue la ruta de acceso y el nombre de un archivo de mapa de bits a cada registro. En la tabla siguiente de ejemplos se muestra el aspecto de los registros:

    Tipo Ejemplo
    Absoluto (local) C:\Windows\Zapotec.bmp
    Absoluto (ruta de acceso 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 código siguiente:

    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 basado 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ódigo y, a continuación, pegue o escriba el código siguiente:

    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 si no se encuentra la imagen, recibirá los mensajes adecuados 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ódigo y, a continuación, pegue o escriba el código siguiente:

    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 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 si no se encuentra la imagen, recibirá los mensajes adecuados en lugar del marco de imagen.

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

  1. Cree la siguiente página de acceso a datos que se basa 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 Oculto.

  2. En el menú Herramientas, seleccione Macros y, a continuación, haga clic en Microsoft Script Editor.

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

    Nota:

    Debe pasar un parámetro 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 de imagen.

Uso de 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) como se indica a continuación:

  1. Agregue un control Microsoft Web Browser 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