Leçon 35 : Formulaires : Liens OLE (Insertion d'images et d'objets aux enregistrements)

Temps nécessaire pour suivre cette leçon : Entre une demie heure et quarante minutes

Attention : Pour suivre l'intégralité de cette leçon, vous devez disposer de Word et d'Excel. S'il vous manque Excel, vous pourrez toutefois suivre l'ensemble de la leçon, mais pas l'exercice en fin de page.

Pour suivre cette leçon, vous devez avoir suivi les leçons précédentes. Ou plus précisément, vous devez être en possession de la base de données ProFormation.mdb telle qu'elle était à la fin de la leçon précédente. Si vous n'êtes pas certain de l'avoir, vous pouvez la télécharger ici

Aperçu de cette leçon

Dans cette leçon, nous allons encore plus loin : nous allons cette fois attacher la photo de chaque personne à chaque enregistrement, ce qui recquiert une toute autre approche !
Nous allons voir en outre qu'il est possible d'attacher à chaque enregistrement toutes sortes de fichiers : des images, certes, mais aussi des documents Word, des feuilles Excel, et d'autres fichiers qui proviennent d'autres programmes pourvu qu'ils supportent d'être intégrés à l'intérieur d'Access !

Sommaire

  1. Formulaires : Initiation à l'insertion d'une image par enregistrement à l'aide d'un objet OLE
  2. Objets OLE : Comparaisons avec le type de données Lien Hypertexte
  3. Formulaires : Insertion d'une image pour un seul enregistrement : cas concret
  4. Objets OLE : Gestion de la taille et de l'alignement des images
  5. Objets OLE : Il est possible d'insérer autre chose que des images
  6. Objets OLE : Gestion de la taille des objets autres que des images
  7. Objets OLE : Modification dynamique du contenu d'un objet OLE
  8. Objets OLE dans les formulaires : Subtilités d'affichage de l'objet en tant que tel
  9. Objets OLE : Différence entre Intégration et Liaison : Bug !

Formulaires : Initiation à l'insertion d'une image par enregistrement à l'aide d'un objet OLE

Placer un logo, c'est bien joli, mais est-il possible d'afficher la photo de chaque client ?

Oui mais la démarche est différente : comme la photo doit changer à chaque enregistrement, on ne peut pas se contenter, de placer la photo en mode création du formulaire : en effet, la photo de qui placerait on ? On ne peut pas le savoir. Ce sera dont en mode SAISIE DE DONNEES que ça va se passer.

Mais attention : On ne peut pas faire ça comme ça ! Il faut que la photo puisse être STOCKEE dans la table sous-jacente ! Je vous rappelle que les formulaires ne contiennent PAS de donnée. Alors, oui, ils peuvent contenir un logo, parce que c'est le même à chaque enregistrement, il ne change pas ! Il fait partie intégrante de la structure du formulaire lui-même... Mais PAS les photos des clients ! Elles, elles changent à CHAQUE client ! Il FAUT qu'on prépare le terrain dans la table T_Celebrite !

Concrètement ?

Avant de créer quoi que ce soit dans le formulaire, allez dans la table T_Celebrite en mode création, et ajoutez un nouveau champ que nous appellerons Photo, et qui sera défini en Objet OLE :

C'est quoi "Objet OLE" ?

Ca veut dire que ce champ très particulier ne va pas contenir des données telles que du texte ou du chiffre, mais va intégrer un objet. Un objet, au sens d'Access, ce n'est pas un lampadaire ou un canapé, non !

Un objet, au sens informatique du terme, c'est un fichier qui a été créé avec un autre programme : Un dessin créé avec Paint est un objet. Un classeur Excel est un objet. Un document Word, est un objet. Ce sont chaque fois des fichiers qui viennent "d'ailleurs".

OLE Sont les intitiales en anglais de Object Linking and Embedding, je vous traduit en français par : "Liaison (Linking) et Incorportation (Embedding) d'objet". Donc, ce champ, à partir du moment qu'il est défini en Objet OLE, va pouvoir contenir aussi bien une feuille Excel, qu'un document Word, un dessin Corel Draw, ou une image. Dans notre cas, il va s'agir d'une image JPEG (Une photo en fait), qui sera donc simplement un fichier à l'extension .JPG.

Le type de champ Objet OLE, est exactement le "pendant" du lien hypertexte : avec le lien hypertexte, vous précisez par exemple un site Web, ou un fichier, mais il fallait cliquer dessus pour Y ALLER.

Ce n'était en quelque sorte qu'un "panneau indicateur" qui disait OU est situé physiquement le fichier. Le type Objet OLE, fait largement plus : En effet, il va CARREMENT chercher le fichier que vous voulez, et il l'importe physiquement dans votre base de données. Je vous recommande très très chaudement de revoir la leçon 10, traitant des liens hypertextes afin qu'il ne subsiste pas de confusion dans votre esprit !


Objets OLE : Comparaisons avec le type de données Lien Hypertexte

Donc, logiquement, les champs OLE prennent énormément plus de place que les liens hypertextes !

C'est parfaitement ça !

...Mais l'avantage est qu'on ne doive pas cliquer sur le lien hypertexte pour voir le document correspondant, cette fois, il s'affiche instantanément !

Oui, tout à fait ! Votre remarque prouve que vous avez très bien compris.

Bon, vous avez votre nouveau champ Photo (Photo n'est pas un nom spécial... J'aurais pu l'appeler ImageClient, TeteDuClient ou LaPhoto).

En mode saisie de données de votre table, vous n'allez pas pouvoir faire grand chose : essayez : lancez la table en mode saisie de données, et essayez de cliquer dans le champ Photo.

En effet : ça met simplement la cellule avec une toute petite bordure grise, mais on ne peut rien y écrire.

C'est normal. En fait, c'est seulement dans les formulaires (et dans les états, mais on y reviendra) qu'on arrive à VOIR le contenu de votre champ Photo.

Maintenant, vous allez fermer la table, et créer un nouveau formulaire en mode création, basé sur T_Celebrite. Donnez lui cette apparence approximativement:


Formulaires : Insertion d'une image pour un seul enregistrement : Cas concret

Lancez le formulaire en mode saisie de données, et allez sur Georges Brassens. C'est maintenant, et SEULEMENT maintenant que vous allez pouvoir lui installer sa photo. Evidemment, vous ne disposez sans doute pas d'une photo de Georges Brassens. Je vous en fournis donc une :

Voici une photo de Georges Brassens que vous allez enregistrer sur votre disque dur : . Si vous ne vous rappelez plus comment on fait, revoyez la leçon précédente.

Vous êtes donc sur l'enregistrement "Brassens Georges", et vous avez enregistré la photo de Georges Brassens sur votre ordinateur en tant que brassens (En fait brassens.jpg, mais vous ne voyez peut-être pas le .JPG, mais là n'est pas notre propos).

Cliquez avec le bouton droit de votre souris au milieu du champ Photo, et choisissez "Insérer un objet" :

La boîte de dialogue suivante apparaît :

Cliquez sur "A partir d'un fichier", et sur le bouton "Parcourir"

APPARTE : ATTENTION : Vous voyez sur l'image, à droite, il y a une case à cocher "Afficher comme icône". Comme son nom l'indique, c'est pour afficher non pas vraiment une image, mais une icône, comme ceci : . MAIS il y a manifestement un bug dans Access, et dans certains cas, et c'est peut être le vôtre, MEME si vous ne cochez pas cette case, l'image s'affiche de toute façon comme une icône, ce qui est vraiment pas cool !

Un élève m'a informé que ce problème est apparemment dû au fait que lors de l'installation d'Office, le logiciel de Microsoft "Photo Editor" a la particularité de permettre de visualiser les images correctement dans un champ OLE D'Access.

Beaucoup de gens installent d'autres programmes de visualisation d'images, tel que ACDSEE par exemple, APRES avoir installé Office. De par ce fait, le nouveau programme (tel que ACDSEE) Court-circuite en quelque sorte Photo Editor, et a pour conséquence fâcheuse d'interdire de visualiser les images au sein des champs OLE autrement que sous forme d'icônes.

Solution : Réinstaller Photo Editor (Nul besoin de désinstaller ACDSEE ou le programme de dessin qui peut entrer en conflit), et tout devrait rentrer dans l'ordre.

Vous allez maintenant pouvoir sélectionner votre fichier brassens.jpg que vous avez récupéré tout à l'heure

Et faites encore OK :

Et voilà le résultat :

Ah oui, effectivement !

Maintenant, si vous descendez ou montez d'un enregistrement, HOP ! L'image disparait instantanément, ce qui est normal puisque c'est la photo de Georges Brassens et de personne d'autre !

Dès que je reviens sur Brassens, il réapparait ! C'est génial !

... Contrairement au Logo de la leçon précédente qui restait affiché, quel que soit l'enregistrement !


Objets OLE : Gestion de la taille et de l'alignement des images

Mais par contre, il est tout coupé... Puis tout collé à gauche !

C'est normal : La photo est verticale, et votre zone d'accueil (le champ Photo) est plutôt horizontale ! Ca ne vous rappelle rien ?

C'est l'histoire du "Zoom" et "Echelle" !

Exactement. MAIS ATTENTION ! Cette fois, c'est en mode création que vous devez être pour changer les options d'affichage !!!! (Bon, si vous travaillez avec Access 2000/XP, vous pouvez demander les propriétés de la photo en mode saisie de données, mais disons pour être homogène que vous allez en mode création).

Oui, mais en mode création, il n'y a plus d'image !

Ben non ! Puisque l'image change à chaque client ! La photo de qui devrait il afficher en mode création ???

C'est juste ! Je n'ai rien dit ...

Demandez les propriétés de votre champ photo qui est donc vide (Vous savez : Bouton droit, propriétés). Dans l'onglet Format, vous demandez Mode d'affichage : Zoom (Pas échelle, pour éviter qu'il déforme la photo) : Relancez le formulaire en mode saisie de données, et cherchez à nouveau Brassens :

Il l'a rétrécie pour qu'elle entre dans la zone sans la déformer. On ne peut pas la mettre au milieu de la zone, et pas collée à gauche ?

J'ai cherché comme vous, mais ce n'est apparemment pas possible : Quand je clique dessus, je n'ai pas accès à l'icône H... Et dans les propiriétés, je n'ai pas trouvé d'alignement central de l'image. Donc, non.

On n'a qu'à redimensionner la zone du champ photo en vertical, comme ceci :

Exactement. J'avais fait exprès de dimensionner la zone dans le mauvais sens pour que vous trouviez l'astuce vous-même. Bravo !

Et en plus, dans les propriétés de l'image , vous demandez dans l'onglet format Mode d'affichage : Echelle, comme ça, on est bien certain que l'image va bien prendre la totalité de la zone de la photo, et comme cette zone est déjà verticale, les différentes photos des différentes personnes ne seront pas trop déformées. Essayez :

C'est impeccable comme ça !

Et comme la zone de la photo correspond à peu près aux photos originales, ça ne va pas trop mal. Comme exercice, vous allez ajouter la photo de Bill Clinton. La voici :

Ce n'est pas évident car il faut bien se rappeler de la marche à suivre, mais voilà le résultat :


Objets OLE : Il est possible d'insérer autre chose que des images

Peut-on inclure autre chose que des photos ?

Oui, et c'est le plus intéressant : comme je vous l'ai précisé plus haut, le champ Photo, même s'il s'appelle physiquement "Photo", peut très bien accueillir d'autres genres de fichiers, comme par exemple un document Word : imaginez que notre table T_Celebrite est en fait une table de gens à la recherche d'un emploi, et que chaque personne a son CV sous forme d'un document Word : il va tout à fait être possible de le mettre A LA PLACE de sa photo !

Et si je voulais sa photo ET son CV ?

Nous aurions alors dû créer non pas un, mais DEUX nouveaux champs de type Objet OLE : Un champ qui s'appelle "Photo" pour mettre la photo, et un champ "CV" qui serait aussi un champ Objet OLE, mais qui contiendrait le CV (fait avec Word): Le résultat serait éloquent : . Sympathique, non ?

Mais pour éviter de trop alourdir la base de données, pour vous simplifier la tâche, et aussi pour bien illustrer le fait qu'un champ OLE peut contenir indifféremment une image ou autre chose, nous n'allons PAS créer de nouveau champ dans la table.

Nous allons donc REMPLACER la photo de Bill Clinton par son CV. Pour ce faire, il vous faut un document Word qui va contenir son CV. Vous ne l'avez pas, le voici :

Téléchargez le CV de Bill Clinton en cliquant ICI

C'est comme pour le téléchargement d'une base de données, Je ne pense pas que ça devrait vous poser de problème. Evidemment il faut posséder Word, mais je suppose que vous en disposez. Placez ce fichier Word sur votre disque dur où vous voulez. Je vais supposer que vous le mettez dans C:\Mes Documents.

ATTENTION : Il est possible que le document s'ouvre automatiquement, sans que vous ayez besoin de le télécharger comme une base de données. Si c'est le cas, et qu'il s'ouvre automatiquement, vous allez directement dans le menu Fichier/Enregistrer Sous, et c'est là que vous précisez exactement ou vous voulez que ce document soit placé.

J'ai rapatrié le fichier cvclinton.doc, et je l'ai placé dans C:\Mes Documents. Ouf !

Bien. Lancez votre formulaire en mode saisie de données, et placez-vous sur Bill Clinton : . Vous cliquez ensuite sur son visage avec le bouton droit de votre souris, et vous choisissez "Insérer un objet"

Comme quand on a mis sa photo ?


Objets OLE : Gestion de la taille des objets autres que des images

C'est ça. Et donc, vous suivez les mêmes étapes que tout à l'heure, mais cette fois, vous choisissez le document Word cvclinton.doc.. Vous devriez obtenir ce résultat :

Qu'est ce que c'est que cette saloperie ???

C'est votre CV fait par Word.

Mais on arrive rien à lire !

Oui, pourquoi ?

Je n'en sais rien, moi...
Hum.. Ah OUIIIIIII ! Je sais : C'est parce qu'on a demandé un mode d'affichage "Echelle" pour que toute l'image soit compressée pour bien entrer dans le champ Photo, et il a fait la même chose avec notre document Word, évidemment !

Voilà. Alors, avec les images normales, ça se passe très bien, mais avec un document Word qui est manifestement trop grand pour entrer dans notre zone d'image, Access compresse ce fichier comme si c'était une image, mais on n'arrive plus rien à lire...

Logique !

Eh oui. Donc, pas le choix : Si vous voulez lire votre CV correctement, il faut arrêter de demander un mode d'affichage Echelle, et demander "Découpage", et, bien sûr, agrandir la zone de manière à obtenir ce chouette résultat : . Vous croyez que vous pouvez faire ça tout seul ?

Je reviens en mode création, j'agrandis ma zone, je clique avec le bouton droit, je recherche le mode d'affichage que je met sur découpage, je relance le mode saisie de données, je regarde si ça va... Oui, oui, j'arrive a me débrouiller.

C'est fait ?

Exactement, j'ai la même chose que vous maintenant. Bon, évidemment, maintenant qu'on a changé les options d'affichage, quand on va sur quelqu'un qui a une photo, comme Brassens, la photo est à nouveau toute collée à droite : !

Oui, c'est normal.


Objets OLE : Modification dynamique du contenu d'un objet OLE

Oui. Et le CV de Bill Clinton, est-ce que je peux le modifier directement depuis Access si je veux ?

Oui ! Et ça, c'est génial ! Allez sur Bill Clinton, et double-cliquez sur son CV : . Vous avez un petit sablier qui montre qu'il travaille, et au bout de quelques secondes, vous avez cet affichage :

Vous êtes toujours dans Access MAIS pas complètement !
En fait, vous êtes dans une sorte de mini Word à l'intérieur d'Access : Regardez attentivement les menus : ce sont les menus de Word ! Les barres d'outils : ce sont les barres d'outils de Word ! Vous avez les règles horizontales et verticales de Word... Et pourtant c'est toujours indiqué Access dans la barre de titre tout au dessus ! :

Et là, maintenant, je peux ajouter par exemple l'adresse de Bill Clinton ?

Oui : Vous cliquez juste en dessous de prénom, et vous écrivez Adresse :, une tabulation , et Maison Blanche, vous appuyez sur enter pour passer une ligne pour faire joli, puis vous mettez Adresse en bleu comme ceci :

Et quand j'ai fini, comment fais-je pour revenir à mon formulaire Access ?

Il suffit bêtement de cliquer sur une partie de votre formulaire, n'importe laquelle, ici par exemple :


Objets OLE dans les formulaires : Subtilités d'affichage de l'objet en tant que tel

Il ne faut pas se tromper, parce que il y a 3 cas de figure :

Le mode création
Qui permet de demander par exemple le mode d'affichage avec Bouton droit de la souris, puis "propriétés" (Découpage, Echelle, Zoom), et qui permet également de redimensionner la zone. Les petits carrés sont là parce que j'ai cliqué une fois dessus pour le sélectionner
Le mode saisie de données :
Qui permet de visualiser simplement le contenu du champ, et qui permet d'insérer un nouvel objet avec bouton droit de la souris, puis "Insérer un objet". Les petits carrés sont là parce que j'ai cliqué une fois dessus pour le sélectionner, mais en mode saisie de données, je ne peux pas redimensionner la zone.
Le mode modification du champ
Qui permet de modifier carrément le contenu du fichier clinton.doc (comme par exemple ajouter l'adresse) Il y a aussi des petits carrés noirs sur les côtés et dans les coins avec une ligne épaisse grise foncée. Ce nous est pas utile ici.

Bon, maintenant, attention : Petite subtilité technique : quand vous avez inséré votre fichier cvclinton.doc dans votre formulaire, Access a fait une COPIE du fichier original. C'est à dire que comme c'est une copie, quand vous cliquez deux fois sur le CV pour le modifier, c'est en fait la COPIE qui est modifiée, et PAS l'original ! Il faut bien faire attention, parce que vous changez quelque chose dans le fichier via Access... Tiens ben ça tombe bien, c'est ce qu'on a fait : On a ajouté l'adresse de Clinton. MAIS... si vous lancez Word, et que depuis Word normal cette fois, vous Allez dans le menu Fichier/Ourir, et que vous ouvrez cvclinton.doc vous allez constater qu'il n'a PAS CHANGE ! Il n'a PAS l'adresse de Bill Clinton !


Objets OLE : Différence entre Intégration et Liaison : Bug !

Et il n'y a pas une option pour que justement quand on change dans Access, ça change VRAIMENT le fichier cvclinton.doc ?

Normalement oui, il y a une option : au moment ou vous demandez Bouton droit de la souris : Insérer un objet, A partir du fichier, vous avez une petite case à cocher : "Liaison" :

Quand vous mettez cette coche, il vous donne un petit texte d'explication très clair : Le fait de mettre cette coche fera en sorte que votre fichier sera lié, et non pas incorporé à votre formulaire : Ce qui implique donc que quand vous faites ensuite des modifications sur votre fichier via Access, ces modifications seront VRAIMENT faites dans le fichier de base.

Si vous supprimez, changez de place ou renommez le fichier cvclinton.doc, la liaison sera cassée, par contre ça prendra moins de place dans la base de données. Vous suivez ? Non ? De toute façon, que vous ayez compris ou pas, c'est égal parce que cette fonction ne marche pas : Que vous mettiez la coche ou pas, de toute façon, le fichier sera incorporé (copié), et non pas attaché (lié). Et donc de toute façon votre base de données va bien grossir de par ce fait, et quand vous cliquerez 2 fois sur un fichier pour le modifier, ça ne modifiera QUE la copie dans Access... C'est comme ça. Que ce soit dans Access 97 ou 2000, c'est le même prix. Je ne sais pas si Microsoft à corrigé ce bug dans Access XP.

Mais pas toujours . Certains élèves m'ont écrit pour me dire que chez eux, cette liaosn fonctionne correctement... Je ne sais pas quoi vous dire de plus... Avec un peu de chance chez vous, ça marchera... Personnellement, je travaille maintenant avec Access XP, et ça al'air de se comporter correctement.

Et on ne peut vraiment pas remédier à ça ?

Pas facilement. seul du code Visual Basic assez complexe peut faire quelque chose. Mais nous débordons ici du sujet. Nous arrivons au terme de cette leçon

Fermez votre formulaire, et appelez-le F_CelebriteObjetOLE

Bon... Hem... On peut résumer ?

L'une des fantastiques possibilités d'Access est d'interagir étroitement avec d'autres fichiers tels que des images, des documents Word, des feuilles Excel, etc.

Via un type de données qui est l'objet OLE (Object Linking and Embedding, soit "liaison et incorporation d'objet"). Nous avons vu comment faire pour que chaque enregistrement, chaque personne aie sa photo, ou son CV créé avec Word. Nous avons vu comment changer facilement d'objet en remplaçant une image par un document Word, et nous avons malheureusement constaté qu'il n'est possible que d'incorporer des objets par copie, sans possibilité de faire des liaisons simples, bien que cela paraisse possible.

Nous avons vu que les modes d'affichage et la taille des champs sont déterminants pour obtenir un affichage lisible (Les documents Word supportent mal un mode d'affichage de type "Echelle", contrairement aux images)

Avez-vous bien compris ?

  1. Pour insérer un fond d'écran dans un formulaire, il est nécessaire d'avoir un objet OLE dans la table sous-jacente
    a. Oui
    b. Non ***
    c. Seulement si le fond d'écran est en format JPG

  2. On peut voir les images insérées dans un champ de type OLE directement :
    a. Dans les tables
    b. Dans les requêtes
    c. Dans les formulaires ***
    d. Dans les tables, les requêtes et les fomulaires

  3. Un champ OLE peut contenir pour un enregistrement une feuille Excel, tandis que pour un autre enregistrement, ce sera plutôt un document Word ?
    a. Oui, sans problème ***
    b. Non
    c. Oui, mais il faut demander l'option de champ dans la table : "Multi-documents" : oui
    d. Oui, mais a condition d'avoir la propiété "Multi-document activé" à Oui dans le formulaire

  4. Quand on clique 2 fois sur un champ de type OLE (dans un formulaire) qui contient un classeur Excel :
    a. On peut le modifier, ça ne modifie pas le fichier original, mais seulement la copie locale installée dans le formulaire ***
    b. On peut le modifier, ça modifie automatiquement également le fichier qui a servi de base à cette insertion de fichier Excel
    c. Ca permet de changer sa taille à l'écran
    d. On ne peut pas cliquer deux fois dessus en mode saisie de données. C'est seulement en mode création qu'on peut le faire

  5. Il est possible d'avoir un champ OLE dans un formulaire, qui contiendra quelque chose de différent à chaque enregistrement SANS avoir besoin de créer un chamo OLE dans la table sous-jacente ?
    a. Oui, sans problème
    b. Non ***
    c. Oui, mais seulement dans le cas de moins de 255 enregistrements
    d. Oui, mais il ne sera possible d'insérer QUE des images de type JPG

Pour voir les solutions, il vous suffit de sélectionner le questionnaire ci-dessus : 3 petites étoiles *** apparaîtront en face des bonnes réponses.

Exercice

L'exercice consiste à créer une nouvelle base de données que vous appellerez PrestiVoiture.MDB. Dans cette base de données, vous allez créer une table T_Voiture qui va contenir des voitures. Chaque voiture devra avoir les renseignements suivants : Sa marque, son type, une photo, et ses caractéristiques techniques.

Pour vous aider à remplir cette table, voici les données des 2 premières voitures :

  1. Ferrari Testarossa, , Téléchargez ici ses caractéristiques techniques (feuille Excel)
  2. Lamborghini Countach, , Téléchargez ici ses caractéristiques techniques (document Word)

Votre travail consistera ensuite à créer un formulaire F_Voiture, qui contiendra en haut le logo "Presti Voiture", que voici : , et, pour chque voiture, sa marque, son type, sa photo et ses caractéristiques techniques. Voici l'exemple du premier enregistrement (la Lamborghini) :

Astucieux : J'ai demandé la couleur de fond des 2 objets OLE en ... transparent !

Réfléchissez bien à ce que vous allez faire avant de vous précipiter sur la solution...

Téléchargez la solution de l'exercice ici

Si vous n'êtes pas tout à fait certain d'avoir suivi correctement toutes les étapes de cette leçon, vous avez la possibilité de télécharger ici la version de ProFormation.mdb exactement dans l'état ou elle devrait être à la fin de cette leçon.

Avez-vous une question technique concernant cette leçon ? Cliquez ici !
Une remarque sur cette leçon ? Un problème ? Une erreur ? une ambiguité ? Soyez gentil de m'en informer