Come visualizzare immagini da una cartella in una maschera, un report o una pagina di accesso ai dati

Numero KB originale: 285820

Nota

Richiede competenze esperte di codifica, interoperabilità e multiutente. Questo articolo si applica a un database di Microsoft Access (.mdb/.accdb) e a un progetto di Microsoft Access (con estensione adp).

Riepilogo

A volte, non è pratico archiviare immagini in una tabella di Microsoft Access. Se si dispone di molte immagini o se ognuno dei file di immagine è di grandi dimensioni, le dimensioni del file di database di Microsoft Access possono aumentare rapidamente.

Questo articolo illustra una funzione personalizzata che è possibile usare per:

  • Archiviare i percorsi di file e i nomi delle immagini in una tabella.
  • Visualizzare le immagini usando un controllo immagine.
  • Nascondere il controllo immagine se non è disponibile alcuna immagine.
  • Fornire commenti e suggerimenti sullo stato di visualizzazione dell'immagine.

Questo articolo contiene anche uno script visual basic di esempio che è possibile usare per visualizzare le immagini in una pagina di accesso ai dati.

Nota

Anche se questo esempio usa immagini bitmap (.bmp), è anche possibile usare altri tipi di immagine, ad esempio .jpg, pcx e .gif.

Microsoft fornisce esempi di programmazione a scopo puramente illustrativo, senza alcuna garanzia di qualsiasi tipo, sia espressa che implicita, ivi incluse, senza limitazioni, le garanzie implicite di commerciabilità o idoneità per uno scopo particolare. In questo articolo si presuppone che l'utente conosca il linguaggio di programmazione in questione e gli strumenti utilizzati per creare ed eseguire il debug delle procedure. Gli esperti Microsoft sono autorizzati a fornire spiegazioni in merito alla funzionalità di una particolare routine, ma in nessun caso a modificare questi esempi per fornire funzionalità aggiuntive o a creare routine atte a soddisfare specifiche esigenze.

Creazione della tabella per archiviare i dati di file e percorsi

  1. Aprire il database di esempio, Northwind.mdb o il progetto di esempio NorthwindCS.adp.

  2. Creare la tabella seguente in Northwind.mdb o in NorthwindCS.adp.

    In 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
    

    In 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. Aprire la tabella tblImage in visualizzazione Foglio dati e quindi aggiungere il percorso e il nome di un file bitmap a ogni record. La tabella di esempi seguente illustra l'aspetto dei record:

    Tipo Esempio
    Assoluto (locale) C:\Windows\Zapotec.bmp
    Assoluto (percorso UNC) \\Servername\sharename\Zapotec.bmp
    Relativo Zapotec.bmp

Creazione della funzione personalizzata

  1. Creare un nuovo modulo e quindi incollare o digitare il codice seguente:

    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. Salvare il modulo come Module1.

Uso della funzione personalizzata in un modulo

  1. Creare il nuovo modulo seguente basato sulla tabella 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 non si desidera che il percorso venga visualizzato nel modulo, è possibile impostare la Visible proprietà del txtImageName controllo su False.

  2. Scegliere Codice dal menu Visualizza e quindi incollare o digitare il codice seguente:

    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. Aprire la maschera frmImage nella visualizzazione Maschera. Si noti che nel modulo viene visualizzata la bitmap corrispondente per ogni record. Se il txtImageName campo è vuoto o se non è possibile trovare l'immagine, si ricevono messaggi appropriati anziché la cornice dell'immagine.

Uso della funzione personalizzata in un report

  1. Creare il nuovo report seguente basato sulla tabella 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 non si desidera che il percorso venga visualizzato nel report, è possibile impostare la Visible proprietà del txtImageName controllo su False.

  2. Scegliere Codice dal menu Visualizza e quindi incollare o digitare il codice seguente:

    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. Aprire il report rptImage nell'anteprima di stampa. Si noti che nel report viene visualizzata la bitmap corrispondente per ogni record. Se il txtImageName campo è vuoto o se non è possibile trovare l'immagine, si ricevono messaggi appropriati anziché la cornice dell'immagine.

Duplicazione della funzione personalizzata in una pagina di accesso ai dati

  1. Creare la nuova pagina di accesso ai dati seguente basata sulla tabella 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 non si desidera che il percorso venga visualizzato nella pagina, è possibile impostare la Visibility proprietà del txtImageName controllo su Nascosto.

  2. Scegliere Macro dal menu Strumenti e quindi fare clic su Microsoft Script Editor.

  3. Aggiungere lo script seguente all'evento Current di MSODSC nella parte del tag HEAD del documento HTML.

    Nota

    È necessario passare un parametro affinché l'evento venga attivato.

    <SCRIPT language=vbscript event=Current(oEventInfo) for=MSODSC>
    <!--
    ImageFrame.src=txtImageName.value
    -->
    </SCRIPT>
    
  4. Aprire la pagina dapImage nella visualizzazione Pagina. Si noti che nella pagina viene visualizzata la bitmap corrispondente per ogni record. Se il campo txtImageName è vuoto, viene visualizzata un'icona di controllo. Se non è possibile trovare l'immagine, nel controllo immagine viene visualizzata un'icona X.

Usare un percorso http:// in un modulo

Per usare un percorso http:// in un modulo, usare il controllo Web browser (shdocvw.dll) come indicato di seguito:

  1. Aggiungere un controllo Microsoft Web Browser al modulo e denominarlo WebBrowser.

  2. Aggiungere il codice seguente a un modulo:

    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. Aggiungere il codice seguente dietro il modulo:

    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