Como apresentar imagens de uma pasta num formulário, relatório ou página de acesso a dados

Número original da BDC: 285820

Nota

Requer codificação especializada, interoperabilidade e competências multiutilizadas. Este artigo aplica-se a uma base de dados do Microsoft Access (.mdb/.accdb) e a um projeto do Microsoft Access (.adp).

Resumo

Por vezes, não é prático armazenar imagens numa tabela do Microsoft Access. Se tiver muitas imagens ou se cada um dos seus ficheiros de imagem for grande, o tamanho do ficheiro de base de dados do Microsoft Access pode aumentar rapidamente.

Este artigo demonstra uma função personalizada que pode utilizar para:

  • Armazene caminhos de ficheiros e nomes de imagens numa tabela.
  • Apresentar imagens utilizando um controlo de imagem.
  • Oculte o controlo de imagem se não existir nenhuma imagem disponível.
  • Forneça feedback sobre o estado de apresentação da imagem.

Este artigo também contém um script de exemplo do Visual Basic que pode utilizar para apresentar as imagens numa página de acesso a dados.

Nota

Embora este exemplo utilize imagens de mapa de bits (.bmp), também pode utilizar outros tipos de imagem, como .jpg, .pcx e .gif.

A Microsoft fornece exemplos de programação apenas a título informativo, sem qualquer garantia expressa ou implícita, incluindo, sem limitações, as garantias implícitas de comercialização e/ou adequação a um fim específico. Este artigo pressupõe que o utilizador está familiarizado com a linguagem de programação demonstrada e as ferramentas utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às suas necessidades específicas.

Criar a tabela para armazenar dados de ficheiros e caminhos

  1. Abra a base de dados de exemplo, Northwind.mdb ou o projeto de exemplo NorthwindCS.adp.

  2. Crie a seguinte tabela no Northwind.mdb ou em NorthwindCS.adp.

    Em 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
    

    Em 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 a tabela tblImage na vista Folha de Dados e, em seguida, adicione o caminho e o nome de um ficheiro de mapa de bits a cada registo. A seguinte tabela de exemplos mostra o aspeto dos registos:

    Tipo Exemplos:
    Absoluto (Local) C:\Windows\Zapotec.bmp
    Absoluto (Caminho UNC) \\Servername\sharename\Zapotec.bmp
    Relativo Zapotec.bmp

Criar a função personalizada

  1. Crie um novo módulo e, em seguida, cole ou escreva o seguinte 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 o módulo como Módulo1.

Utilizar a função personalizada num formulário

  1. Crie o seguinte novo formulário baseado na tabela 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

    Se não quiser que o caminho seja apresentado no formulário, pode definir a Visible propriedade do txtImageName controlo como Falso.

  2. No menu Ver , clique em Código e, em seguida, cole ou escreva o seguinte 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 o formulário frmImage na vista Formulário. Tenha em atenção que o formulário apresenta o mapa de bits correspondente para cada registo. Se o txtImageName campo estiver em branco ou se não for possível encontrar a imagem, receberá as mensagens adequadas em vez da moldura da imagem.

Utilizar a função personalizada num relatório

  1. Crie o novo relatório seguinte baseado na tabela 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

    Se não quiser que o caminho seja apresentado no relatório, pode definir a Visible propriedade do txtImageName controlo como Falso.

  2. No menu Ver , clique em Código e, em seguida, cole ou escreva o seguinte 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 o relatório rptImage na pré-visualização. Tenha em atenção que o relatório apresenta o mapa de bits correspondente para cada registo. Se o txtImageName campo estiver em branco ou se não for possível encontrar a imagem, receberá as mensagens adequadas em vez da moldura da imagem.

Duplicar a função personalizada numa página de acesso a dados

  1. Crie a seguinte nova página de acesso a dados baseada na tabela 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

    Se não quiser que o caminho seja apresentado na página, pode definir a Visibility propriedade do txtImageName controlo como Oculto.

  2. No menu Ferramentas, aponte para Macros e, em seguida, clique em Microsoft Script Editor.

  3. Adicione o seguinte script ao evento Atual do MSODSC na parte da etiqueta HEAD do documento HTML.

    Nota

    Tem de transmitir um parâmetro para que o evento seja acionado.

    <SCRIPT language=vbscript event=Current(oEventInfo) for=MSODSC>
    <!--
    ImageFrame.src=txtImageName.value
    -->
    </SCRIPT>
    
  4. Abra a página dapImage na Vista de página. Tenha em atenção que a página apresenta o mapa de bits correspondente para cada registo. Se o campo txtImageName estiver em branco, será apresentado um ícone de controlo. Se não for possível encontrar a imagem, é apresentado um ícone X no controlo de imagem.

Utilizar um caminho de http:// num formulário

Para utilizar um caminho de http:// num formulário, utilize o controlo do browser (shdocvw.dll) da seguinte forma:

  1. Adicione um controlo do Microsoft Web Browser ao formulário e dê-lhe o nome WebBrowser.

  2. Adicione o seguinte código a um 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. Adicione o seguinte código por trás do formulário:

    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