Mise en place de la table

La table d'exemple est composée de 4 champs :

Nom du champ Type de données Description
Id Image NuméroAuto Numéro de l'image attribué automatiquement par Access.
Nom Image Texte, 30 caractères Nom de l'image en clair.
Nom Fichier Texte, 255 caractères Le nom du fichier image (sans le chemin d'accès complet).
Par exemple : logo.gif
Dossier Texte, 255 caractères Le nom du dossier contenant l'image.
Par exemple : C:\Users\Hervé\Pictures\
Ce dossier peut se terminer ou non par un \.
Info
L'intérêt de stocker le dossier séparément du nom du fichier est que ça devrait, à long terme, faciliter le déplacement des images. Si les images sont déplacées, seul leur dossier doit être mis à jour (et ça peut se faire en une requête Mise à jour, par exemple).

D'autre part, pensez à aménager le dossier en fonction de votre système. Sur Windows XP, les chemins sont du style C:\Documents and Settings\UTILISATEUR\Mes documents, alors que sur Vista ils sont plutôt C:\Users\UTILISATEUR\Documents. Merci Vista, de faire enfin plus efficace sur ce point !

Le formulaire

Le formulaire est construit à partir de la table tblImages. Il en reprend donc les 4 champs. A ces 4 champs, on ajoute manuellement 1 champ supplémentaire, qui est un objet Image, nommé imgApercu.

Quelques remarques :

  • Le champ imgApercu, de type Image, affichera l'image, une fois qu'elle sera chargée depuis le disque (et non lue dans la table).
  • Ce champ imgApercu contient une image quelconque visible en mode Création de formulaire. Il faut au moins cette image pour que le champ existe, sur les anciennes versions d'Access.
  • La propriété Mode d'affichage du champ imgApercu a été réglée sur Zoom au lieu de Découpage, de façon à ce que chaque image s'adapte à la zone rectangulaire.
  • Si le formulaire est tabulaire (propriété Format d'affichage égale à Continu au lieu de Mode simple), l'image est identique pour tous les enregistrement affichés, et elle change pour tous à chaque déplacement. En résumé : ça ne marche pas sur un formulaire tabulaire !

Le code Visual Basic

Comme aucune image n'est stockée dans la table, il faut un peu de code VB pour lire l'image du disque et la placer dans le champ imgApercu. Le meilleur endroit pour placer ce code est l'événement Après Màj du champ Nom Fichier. De cette façon, à chaque fois qu'on modifie le nom du fichier image, l'image est (ré)affichée.

Private Sub Chemin_AfterUpdate()
  Dim strCheminComplet As String
 
  On Error Resume Next
  If IsNull(Me![Nom Fichier]) Then
      Me.imgApercu.Picture = ""
  Else
      ' Chemin d'accès à l'image = Répertoire de base + Nom de l'image
      strCheminComplet = AddBackslash(Nz(Me![Dossier], "")) & Me![Nom Fichier]
           
      ' Charger l'image
      Me![imgApercu].Picture = IIf(strCheminComplet = "", "", strCheminComplet)
  End If
End Sub
Info
Le bout de code ci-dessus fait appel à une fonction AddBackSlash() qui n'existe pas en VBA. Vous trouverez cette fonction sur cette page du grenier (et vous la recopierez, comme le reste, dans un module standard de votre base de données).

Quelques finitions

Ceci fonctionne bien si l'on change le nom de l'image. Mais il faut aussi gérer le fait de se déplacer d'une image à une autre (d'un enregistrement de table à un autre), sinon l'image affichée sera toujours la même. Pour ceci, il faut recopier le code VB dans l'événement Sur activation du formulaire, ou plus simplement, placer la ligne suivante dans ce même événement :

Private Sub Form_Current()
  Chemin_AfterUpdate
End Sub

Et maintenant, l'impression !

Une fois votre formulaire au point, vous souhaiterez peut-être imprimer le résultat sur papier. Il faut donc pour cela concevoir un état (rappelons qu'un formulaire n'a pas suffisamment d'options pour gérer l'impression, il n'est tout simplement pas fait pour ça !).

Le principe est le même que précédemment :

  1. Réalisez par l'assistant un état basé sur la table des images.
  2. Ajoutez dans la zone Détail de votre état un objet Image (pioché dans la boîte à outils). Cette zone fera office de container servant à afficher chaque image.
  3. Via la feuille de propriétés, donnez le nom imgApercu à votre objet Image.
  4. Comme sur le formulaire, définissez la propriété Mode d'affichage de l'objet Image sur Zoom.
  5. Copiez le code ci-dessous dans l'événement Au formatage de la section Détail :
Private Sub Détail_Format( _
  Cancel As Integer, _
  FormatCount As Integer)
 
  Dim strChemin As String
 
  On Error Resume Next
  strChemin = AddBackslash(Me.Dossier) & Me.Nom_Fichier
  Me.imgApercu.Picture = strChemin
End Sub

Apuka acheter des cartouches d'encre :o)