Comment afficher des images à partir d’un dossier dans un formulaire, un rapport ou une page d’accès aux données

Numéro de base de connaissances d’origine : 285820

Remarque

Nécessite un codage expert, une interopérabilité et des compétences multiutilisateurs. Cet article s’applique à une base de données Microsoft Access (.mdb/.accdb) et à un projet Microsoft Access (.adp).

Résumé

Parfois, il n’est pas pratique de stocker des images dans une table Microsoft Access. Si vous avez de nombreuses images ou si chacun de vos fichiers image est volumineux, la taille du fichier de base de données Microsoft Access peut rapidement augmenter.

Cet article illustre une fonction personnalisée que vous pouvez utiliser pour :

  • Stockez les chemins d’accès aux fichiers et les noms des images dans une table.
  • Afficher des images à l’aide d’un contrôle d’image.
  • Masquez le contrôle d’image si aucune image n’est disponible.
  • Fournissez des commentaires sur l’état d’affichage de l’image.

Cet article contient également des exemples de script Visual Basic que vous pouvez utiliser pour afficher les images dans une page d’accès aux données.

Remarque

Bien que cet exemple utilise des images bitmap (.bmp), vous pouvez également utiliser d’autres types d’images, tels que .jpg, .pcx et .gif.

Microsoft fournit des exemples de programmation à titre d'illustration uniquement, sans garantie expresse ou implicite. Cela inclut, sans y être limité, les garanties implicites de commercialisation et d'adaptation à un but en particulier. Cet article considère que vous connaissez le langage de programmation présenté et les outils utilisés pour créer et déboguer des procédures. Les techniciens du Support technique Microsoft peuvent vous expliquer les fonctionnalités d'une procédure particulière, mais ils ne peuvent pas modifier les exemples en vue de vous fournir des fonctionnalités supplémentaires ou de créer des procédures répondant à vos besoins spécifiques.

Création de la table pour stocker les données de fichier et de chemin d’accès

  1. Ouvrez l’exemple de base de données Northwind.mdb ou l’exemple de projet NorthwindCS.adp.

  2. Créez le tableau suivant dans Northwind.mdb ou NorthwindCS.adp.

    Dans 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
    

    Dans 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. Ouvrez la table tblImage en mode Feuille de données, puis ajoutez le chemin d’accès et le nom d’un fichier bitmap à chaque enregistrement. Le tableau d’exemples suivant montre à quoi peuvent ressembler les enregistrements :

    Type Exemple
    Absolu (local) C:\Windows\Zapotec.bmp
    Absolu (chemin UNC) \\Servername\sharename\Zapotec.bmp
    Relative Zapotec.bmp

Création de la fonction personnalisée

  1. Créez un module, puis collez ou tapez le code suivant :

    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. Enregistrez le module en tant que Module1.

Utilisation de la fonction personnalisée dans un formulaire

  1. Créez le nouveau formulaire suivant basé sur la table 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>
    

    Remarque

    Si vous ne souhaitez pas que le chemin d’accès apparaisse dans le formulaire, vous pouvez définir la Visible propriété du contrôle sur txtImageNameFalse.

  2. Dans le menu Affichage , cliquez sur Code, puis collez ou tapez le code suivant :

    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. Ouvrez le formulaire frmImage en mode Formulaire. Notez que le formulaire affiche la bitmap correspondante pour chaque enregistrement. Si le txtImageName champ est vide ou si l’image est introuvable, vous recevez les messages appropriés au lieu de l’image.

Utilisation de la fonction personnalisée dans un rapport

  1. Créez le nouveau rapport suivant basé sur la table 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>
    

    Remarque

    Si vous ne souhaitez pas que le chemin d’accès apparaisse dans le rapport, vous pouvez définir la Visible propriété du contrôle sur txtImageNameFalse.

  2. Dans le menu Affichage , cliquez sur Code, puis collez ou tapez le code suivant :

    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. Ouvrez le rapport rptImage en préversion avant impression. Notez que le rapport affiche la bitmap correspondante pour chaque enregistrement. Si le txtImageName champ est vide ou si l’image est introuvable, vous recevez les messages appropriés au lieu de l’image.

Duplication de la fonction personnalisée dans une page d’accès aux données

  1. Créez la page d’accès aux données suivante basée sur la table 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
    

    Remarque

    Si vous ne souhaitez pas que le chemin d’accès apparaisse dans la page, vous pouvez définir la Visibility propriété du contrôle sur txtImageNameHidden.

  2. Dans le menu Outils, pointez sur Macros, puis cliquez sur Microsoft Script Editor.

  3. Ajoutez le script suivant à l’événement Actuel du MSODSC dans la partie de balise HEAD du document HTML.

    Remarque

    Vous devez transmettre un paramètre pour que l’événement soit déclenché.

    <SCRIPT language=vbscript event=Current(oEventInfo) for=MSODSC>
    <!--
    ImageFrame.src=txtImageName.value
    -->
    </SCRIPT>
    
  4. Ouvrez la page dapImage en mode Page. Notez que la page affiche la bitmap correspondante pour chaque enregistrement. Si le champ txtImageName est vide, une icône de contrôle s’affiche. Si l’image est introuvable, une icône X apparaît dans le contrôle d’image.

Utiliser un chemin d’accès http:// dans un formulaire

Pour utiliser un chemin d’accès http:// dans un formulaire, utilisez le contrôle de navigateur Web (shdocvw.dll) comme suit :

  1. Ajoutez un contrôle Microsoft Web Browser au formulaire et nommez-le WebBrowser.

  2. Ajoutez le code suivant à un module :

    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. Ajoutez le code suivant derrière le formulaire :

    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