Access ne trouve systématiquement pas les photos (erreur 2220)
Résolu
KimCharlotte
Messages postés
10
Date d'inscription
Statut
Membre
Dernière intervention
-
RV71 Messages postés 656 Date d'inscription Statut Membre Dernière intervention -
RV71 Messages postés 656 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis nouvelle sur ce forum même si je le consulte régulièrement. Je programme en VBA depuis près de 20 ans mais il y a toujours de nouveaux problèmes à résoudre.
Je modifie en ce moment une base de données VBA créée en 2008. Elle est maintenant dans Office 365 avec Windows 10.
Depuis le passage à Windows 365, les photos ne peuvent plus être affichées.
L'erreur est une boîte de message titrée "Application Photo" qui dit par exemple
"Le fichier image n'a pas été trouvé à l'emplacement indiqué:
I:\agricole\Fleurs\Achillees\Ptarmiga\AchilleaThePearl.JPG
Or la photo est bien à cet endroit, elles sont toutes là.
C'est le message généré par le code quand on trappe l'erreur 2200.
Or le Dir juste avant trouve bien la photo.
C'est une base de données horticole avec un formulaire qui contient la fiche technique d'un cultivar (c'est aux fleurs ce qu'une race est aux chiens...). Il y a un sous-formulaire lié à une table qui contient l'espèce et le cultivar comme clé, un chemin relatif vers une photo. Il y a aussi une dernier champ qui lui est mis à jour à l'ouverture de la base et qui contient le chemin absolu de la photo à partir de currentprojet.path & "\" & CheminRelatifPhoto.
Cette mis à jour est faite ici
Private Sub Form_Load()
Dim stChemin As String
Dim rstPh As DAO.Recordset
Dim stMsg As String
Dim stSQL As String
On Error GoTo Err_Form_Load
optComplet = False
optVente = False
stChemin = CurrentProject.Path
If Right(stChemin, 1) <> "\" Then stChemin = stChemin & "\"
'Effacer les chemins de photo quand il n'y a rien dans le champ photo
stSQL = "Update tb_Photo Set PhotoChemin = null where Photo is null"
DoCmd.RunSQL stSQL
stSQL = "Update tb_Photo Set PhotoChemin = null where Photo < 'a'"
DoCmd.RunSQL stSQL
'Calculer les chemins des photos et placer dans un hyperlien
stSQL = "SELECT * FROM tb_Photo"
Set rstPh = CurrentDb.OpenRecordset(stSQL, dbOpenDynaset)
With rstPh
While Not .EOF
If Not IsNull(!Photo) Then
.Edit
'Au cas où il y aurait des chaînes vides
If Len(!Photo) > 5 Then !PhotoChemin = stChemin & !Photo
.Update
End If
.MoveNext
Wend
End With
Exit_Form_Load:
Set rstPh = Nothing
Exit Sub
Err_Form_Load:
stMsg = "En ouvrant le menu principal," & vbCrLf & Err.Number & ": " & Err.Description
MsgBox stMsg, vbExclamation, "Erreur"
Resume Exit_Form_Load
End Sub
Et l'affichage de la photo se fait ici dans sfrm_Photo
Private Sub Form_Current()
Dim stDir As String
On Error GoTo Err_Form_Current
' si la photo n'est pas définie, on affiche la photo blank.jpg
' CurrentProject.Path : est le chemin de l'application
If Len(Me.txtPhoto) > 0 Then
stDir = Dir(Me.txtPhoto)
If stDir <> " " Then Me.imgPhoto.Picture = Me.txtPhoto
'txtPhoto est le chemin absolu calculé précédemment
Else
Me.imgPhoto.Picture = CurrentProject.Path & "\blank.jpg"
End If
DisplayPhoto
Exit_Form_Current:
Exit Sub
Err_Form_Current:
Select Case Err.Number
Case 2114 'Cas d'un type de fichier photo non supporté ...
MsgBox "Le format de l'image n'est supporté par le contrôle image Picture", vbCritical + vbOKOnly, "Application Photos"
Me.imgPhoto.Picture = CurrentProject.Path & "\images\blank.jpg"
'Me.txtPhoto = vbNullString
Case 2220 'Cas d'un emplacement non valide du fichier image
MsgBox "Le fichier image n'a pas été trouvé à l'emplacement indiqué : " & vbCrLf & _
Me.txtPhoto, vbCritical + vbOKOnly, "Application Photos"
Me.imgPhoto.Picture = CurrentProject.Path & "\blank.jpg"
'Me.txtPhoto = vbNullString
Case Else ' tout autre cas d'erreur
MsgBox "Erreur inattendue : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "Application Photos"
End Select
Err.Clear
Resume Exit_Form_Current
Et la fonction qui ajuste la taille de l'image
Sub DisplayPhoto()
'DisplayPhoto est la sub d'affichage des photos dans le contrôle Image appelé : imgPhoto.
'Cette procédure ajuste l'affichage de la photo au cas où ses dimensions dépasseraient celles du contrôle photo.
'Me.imgPhoto.ImageHeight : donne la hauteur de la Photo (Fichier .jpg par exemple)
'Me.imgPhoto.Height : donne la hauteur du contrôle d'affichage.
' Traitement en fonction de la taille de l'image
' regarde si la hauteur de l'image dépasse celle du controle Picture
If Me.imgPhoto.ImageHeight > Me.imgPhoto.Height Then
' met le controle en mode zoom (3)
Me.imgPhoto.SizeMode = 3
'Me.imgPhoto.SizeMode = 0
Else ' met le contrôle en mode respect de la taille originale
Me.imgPhoto.SizeMode = 0
End If ' si la largeur dépasse et qu'on est en mode taille réelle ...
If (Me.imgPhoto.ImageWidth > Me.imgPhoto.Width) And _
(Me.imgPhoto.SizeMode) = 0 Then
' on met en mode zoom
Me.imgPhoto.SizeMode = 3
'Me.imgPhoto.SizeMode = 0
End If
End Sub
Sauriez-vous pourquoi la photo n'est pas trouvée?
Je suis nouvelle sur ce forum même si je le consulte régulièrement. Je programme en VBA depuis près de 20 ans mais il y a toujours de nouveaux problèmes à résoudre.
Je modifie en ce moment une base de données VBA créée en 2008. Elle est maintenant dans Office 365 avec Windows 10.
Depuis le passage à Windows 365, les photos ne peuvent plus être affichées.
L'erreur est une boîte de message titrée "Application Photo" qui dit par exemple
"Le fichier image n'a pas été trouvé à l'emplacement indiqué:
I:\agricole\Fleurs\Achillees\Ptarmiga\AchilleaThePearl.JPG
Or la photo est bien à cet endroit, elles sont toutes là.
C'est le message généré par le code quand on trappe l'erreur 2200.
Or le Dir juste avant trouve bien la photo.
C'est une base de données horticole avec un formulaire qui contient la fiche technique d'un cultivar (c'est aux fleurs ce qu'une race est aux chiens...). Il y a un sous-formulaire lié à une table qui contient l'espèce et le cultivar comme clé, un chemin relatif vers une photo. Il y a aussi une dernier champ qui lui est mis à jour à l'ouverture de la base et qui contient le chemin absolu de la photo à partir de currentprojet.path & "\" & CheminRelatifPhoto.
Cette mis à jour est faite ici
Private Sub Form_Load()
Dim stChemin As String
Dim rstPh As DAO.Recordset
Dim stMsg As String
Dim stSQL As String
On Error GoTo Err_Form_Load
optComplet = False
optVente = False
stChemin = CurrentProject.Path
If Right(stChemin, 1) <> "\" Then stChemin = stChemin & "\"
'Effacer les chemins de photo quand il n'y a rien dans le champ photo
stSQL = "Update tb_Photo Set PhotoChemin = null where Photo is null"
DoCmd.RunSQL stSQL
stSQL = "Update tb_Photo Set PhotoChemin = null where Photo < 'a'"
DoCmd.RunSQL stSQL
'Calculer les chemins des photos et placer dans un hyperlien
stSQL = "SELECT * FROM tb_Photo"
Set rstPh = CurrentDb.OpenRecordset(stSQL, dbOpenDynaset)
With rstPh
While Not .EOF
If Not IsNull(!Photo) Then
.Edit
'Au cas où il y aurait des chaînes vides
If Len(!Photo) > 5 Then !PhotoChemin = stChemin & !Photo
.Update
End If
.MoveNext
Wend
End With
Exit_Form_Load:
Set rstPh = Nothing
Exit Sub
Err_Form_Load:
stMsg = "En ouvrant le menu principal," & vbCrLf & Err.Number & ": " & Err.Description
MsgBox stMsg, vbExclamation, "Erreur"
Resume Exit_Form_Load
End Sub
Et l'affichage de la photo se fait ici dans sfrm_Photo
Private Sub Form_Current()
Dim stDir As String
On Error GoTo Err_Form_Current
' si la photo n'est pas définie, on affiche la photo blank.jpg
' CurrentProject.Path : est le chemin de l'application
If Len(Me.txtPhoto) > 0 Then
stDir = Dir(Me.txtPhoto)
If stDir <> " " Then Me.imgPhoto.Picture = Me.txtPhoto
'txtPhoto est le chemin absolu calculé précédemment
Else
Me.imgPhoto.Picture = CurrentProject.Path & "\blank.jpg"
End If
DisplayPhoto
Exit_Form_Current:
Exit Sub
Err_Form_Current:
Select Case Err.Number
Case 2114 'Cas d'un type de fichier photo non supporté ...
MsgBox "Le format de l'image n'est supporté par le contrôle image Picture", vbCritical + vbOKOnly, "Application Photos"
Me.imgPhoto.Picture = CurrentProject.Path & "\images\blank.jpg"
'Me.txtPhoto = vbNullString
Case 2220 'Cas d'un emplacement non valide du fichier image
MsgBox "Le fichier image n'a pas été trouvé à l'emplacement indiqué : " & vbCrLf & _
Me.txtPhoto, vbCritical + vbOKOnly, "Application Photos"
Me.imgPhoto.Picture = CurrentProject.Path & "\blank.jpg"
'Me.txtPhoto = vbNullString
Case Else ' tout autre cas d'erreur
MsgBox "Erreur inattendue : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "Application Photos"
End Select
Err.Clear
Resume Exit_Form_Current
Et la fonction qui ajuste la taille de l'image
Sub DisplayPhoto()
'DisplayPhoto est la sub d'affichage des photos dans le contrôle Image appelé : imgPhoto.
'Cette procédure ajuste l'affichage de la photo au cas où ses dimensions dépasseraient celles du contrôle photo.
'Me.imgPhoto.ImageHeight : donne la hauteur de la Photo (Fichier .jpg par exemple)
'Me.imgPhoto.Height : donne la hauteur du contrôle d'affichage.
' Traitement en fonction de la taille de l'image
' regarde si la hauteur de l'image dépasse celle du controle Picture
If Me.imgPhoto.ImageHeight > Me.imgPhoto.Height Then
' met le controle en mode zoom (3)
Me.imgPhoto.SizeMode = 3
'Me.imgPhoto.SizeMode = 0
Else ' met le contrôle en mode respect de la taille originale
Me.imgPhoto.SizeMode = 0
End If ' si la largeur dépasse et qu'on est en mode taille réelle ...
If (Me.imgPhoto.ImageWidth > Me.imgPhoto.Width) And _
(Me.imgPhoto.SizeMode) = 0 Then
' on met en mode zoom
Me.imgPhoto.SizeMode = 3
'Me.imgPhoto.SizeMode = 0
End If
End Sub
Sauriez-vous pourquoi la photo n'est pas trouvée?
A voir également:
- Access ne trouve systématiquement pas les photos (erreur 2220)
- Partager des photos - Guide
- Télécharger toutes les photos google photos - Guide
- Pourquoi ma tv ne trouve pas toutes les chaînes - Guide
- Google photos - Télécharger - Albums photo
- Ou se trouve le presse papier - Guide
8 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
peux-tu utiliser les balises de code (en choisissant "basic") quand tu partages du code VBA?
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
afin de vérifier à quelle ligne se produit l'erreur, peux-tu provisoirement commenter la ligne "
tu écris "le Dir juste avant trouve bien la photo". comment détermines-tu cela?
je suggère de supprimer l'espace entre les guillemets:
tu écris "Or la photo est bien à cet endroit": as-tu vérifié en utilisant (copier/coller) le nom utilisé dans le programme?
peux-tu utiliser les balises de code (en choisissant "basic") quand tu partages du code VBA?
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
afin de vérifier à quelle ligne se produit l'erreur, peux-tu provisoirement commenter la ligne "
on error ..."?
tu écris "le Dir juste avant trouve bien la photo". comment détermines-tu cela?
je suggère de supprimer l'espace entre les guillemets:
If stDir <> ""
tu écris "Or la photo est bien à cet endroit": as-tu vérifié en utilisant (copier/coller) le nom utilisé dans le programme?
En complément de yg_be, as-tu suivi les recommandations ici :
https://docs.microsoft.com/en-ca/office/troubleshoot/access/display-images-using-custom-function
A+
https://docs.microsoft.com/en-ca/office/troubleshoot/access/display-images-using-custom-function
A+
Oui j'ai regardé ça. Outre le fait que je n'ai pas de fichier adp, ça ressemble énormément à mon code.
Faut-il créer un fichier .adp?
J'ai un fichier accdb avec les données qui varie selon les usagers et un fichier accdb contenant la partie programme qui est commune.
La table tb_Photo est dans la partie données.
Faut-il créer un fichier .adp?
J'ai un fichier accdb avec les données qui varie selon les usagers et un fichier accdb contenant la partie programme qui est commune.
La table tb_Photo est dans la partie données.
Bonjour,
En complément de ce que viennent d'écrire Yg_Be et Rv71, tu devrais commencer par faire un "pas à pas" de ton code, pour repérer exactement la ligne où il bloque; et à partir de là voir ce qu'il faut réparer. Et vérifier aussi ce qu'il prend pour valeur de tes paramètres de chemin d'accès. Prend-il seulement le bon chemin d'accès pour aller à ton dossier de photos, ou se perd-il en cours de route vers un autre dossier?
Peut-être l'as-tu déjà fait? Alors excuse-moi.
Une autre solution serait de passer en mode "pièce jointe", mais encore faut--il que le nombre ne soit pas trop important.
Bon courage.
En complément de ce que viennent d'écrire Yg_Be et Rv71, tu devrais commencer par faire un "pas à pas" de ton code, pour repérer exactement la ligne où il bloque; et à partir de là voir ce qu'il faut réparer. Et vérifier aussi ce qu'il prend pour valeur de tes paramètres de chemin d'accès. Prend-il seulement le bon chemin d'accès pour aller à ton dossier de photos, ou se perd-il en cours de route vers un autre dossier?
Peut-être l'as-tu déjà fait? Alors excuse-moi.
Une autre solution serait de passer en mode "pièce jointe", mais encore faut--il que le nombre ne soit pas trop important.
Bon courage.
Je viens de relire, c'est office365 qui t'oblige à tout ce binz ?
Aussi,
Ne sont pas mis à jour ?
Je ne comprends pas trop où tu veux en venir avec ta mise à jour, pourquoi ne pas créer uniquement un champ texte dans lequel tu mettrais le nom du fichier .jpg ?
A+
Aussi,
optComplet = False optVente = False
Ne sont pas mis à jour ?
Je ne comprends pas trop où tu veux en venir avec ta mise à jour, pourquoi ne pas créer uniquement un champ texte dans lequel tu mettrais le nom du fichier .jpg ?
A+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Voilà qui devrait être plus lisible. Encore une fois désolée.
Private Sub Form_Load() Dim stChemin As String Dim rstPh As DAO.Recordset Dim stMsg As String Dim stSQL As String On Error GoTo Err_Form_Load optComplet = False optVente = False stChemin = CurrentProject.Path If Right(stChemin, 1) <> "\" Then stChemin = stChemin & "\" 'Effacer les chemins de photo quand il n'y a rien dans le champ photo stSQL = "Update tb_Photo Set PhotoChemin = null where Photo is null" DoCmd.RunSQL stSQL stSQL = "Update tb_Photo Set PhotoChemin = null where Photo < 'a'" DoCmd.RunSQL stSQL 'Calculer les chemins des photos et placer dans un hyperlien stSQL = "SELECT * FROM tb_Photo" Set rstPh = CurrentDb.OpenRecordset(stSQL, dbOpenDynaset) With rstPh While Not .EOF If Not IsNull(!Photo) Then .Edit 'Au cas où il y aurait des chaînes vides If Len(!Photo) > 5 Then !PhotoChemin = stChemin & !Photo .Update End If .MoveNext Wend End With Exit_Form_Load: Set rstPh = Nothing Exit Sub Err_Form_Load: stMsg = "En ouvrant le menu principal," & vbCrLf & Err.Number & ": " & Err.Description MsgBox stMsg, vbExclamation, "Erreur" Resume Exit_Form_Load End Sub 'Fonction qui ne trouve pas la photo Private Sub Form_Current() Dim stDir As String On Error GoTo Err_Form_Current ' si la photo n'est pas définie, on affiche la photo blank.jpg ' CurrentProject.Path : est le chemin de l'application If Len(Me.txtPhoto) > 0 Then stDir = Dir(Me.txtPhoto) If stDir <> " " Then Me.imgPhoto.Picture = Me.txtPhoto 'Ça bloque ici, erreur 2220 'txtPhoto est le chemin absolu calculé précédemment Else Me.imgPhoto.Picture = CurrentProject.Path & "\blank.jpg" End If DisplayPhoto Exit_Form_Current: Exit Sub Err_Form_Current: Select Case Err.Number Case 2114 'Cas d'un type de fichier photo non supporté ... MsgBox "Le format de l'image n'est supporté par le contrôle image Picture", vbCritical + vbOKOnly, "Application Photos" Me.imgPhoto.Picture = CurrentProject.Path & "\images\blank.jpg" 'Me.txtPhoto = vbNullString Case 2220 'Cas d'un emplacement non valide du fichier image MsgBox "Le fichier image n'a pas été trouvé à l'emplacement indiqué : " & vbCrLf & _ Me.txtPhoto, vbCritical + vbOKOnly, "Application Photos" Me.imgPhoto.Picture = CurrentProject.Path & "\blank.jpg" 'Me.txtPhoto = vbNullString Case Else ' tout autre cas d'erreur MsgBox "Erreur inattendue : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "Application Photos" End Select Err.Clear Resume Exit_Form_Current 'Et la fonction qui ajuste la taille de l'image Sub DisplayPhoto() 'DisplayPhoto est la sub d'affichage des photos dans le contrôle Image appelé : imgPhoto. 'Cette procédure ajuste l'affichage de la photo au cas où ses dimensions dépasseraient celles du contrôle photo. 'Me.imgPhoto.ImageHeight : donne la hauteur de la Photo (Fichier .jpg par exemple) 'Me.imgPhoto.Height : donne la hauteur du contrôle d'affichage. ' Traitement en fonction de la taille de l'image ' regarde si la hauteur de l'image dépasse celle du controle Picture If Me.imgPhoto.ImageHeight > Me.imgPhoto.Height Then ' met le controle en mode zoom (3) Me.imgPhoto.SizeMode = 3 'Me.imgPhoto.SizeMode = 0 Else ' met le contrôle en mode respect de la taille originale Me.imgPhoto.SizeMode = 0 End If ' si la largeur dépasse et qu'on est en mode taille réelle ... If (Me.imgPhoto.ImageWidth > Me.imgPhoto.Width) And _ (Me.imgPhoto.SizeMode) = 0 Then ' on met en mode zoom Me.imgPhoto.SizeMode = 3 'Me.imgPhoto.SizeMode = 0 End If End Sub
Dommage que les balises ne préservent pas l'indentation. Ce serait encore plus lisible.
En mode pas à pas j'affiche le chemin du fichier passé à a fonction dir.
Comme j'ai déjà affiché la photo dans la fonction suivante, l'adresse est correcte.
Dans cette fonction je n'ai pas l'erreur 2220.
En mode pas à pas j'affiche le chemin du fichier passé à a fonction dir.
Comme j'ai déjà affiché la photo dans la fonction suivante, l'adresse est correcte.
Dans cette fonction je n'ai pas l'erreur 2220.
Private Sub cmdAjoutModifPhoto_Click() ' Bouton d'ajout - modification de photo Dim strLink As String Dim stPhoto As String 'Ce qu'il faut conserver du chemin dans la base de données Dim stSQL As String Dim stTitre As String On Error GoTo err_cmdAjoutModifPhoto_Click stTitre = "Choisissez une photo de " & Me.Parent!Nom & " " & Me.Parent!Cultivar ' récupération du chemin physique de la photo ' par la boite de dialogue strLink = modFichiers.ChoisirFichier(stTitre) ' si la boite renvoie une adresse non nulle If Len(strLink) > 0 Then ' tentative d'affichage de la photo Me.imgPhoto.Picture = strLink 'Sauvegarde d'une portion du chemin relative au projet dans la base de données iPos = Len(CurrentProject.Path) stPhoto = Right(strLink, Len(strLink) - iPos - 1) Me.txtPhoto = stPhoto DoEvents If Me.Dirty Then Me.Dirty = False stSQL = "UPDATE tb_Photo SET PhotoChemin = '" & strLink & "' WHERE Nom = '" & Me.Parent!Nom & "' AND Cultivar = '" & Me.Parent!Cultivar & "'" DoCmd.RunSQL stSQL End If DisplayPhoto Exit_cmdAjoutModifPhoto_Click: Exit Sub err_cmdAjoutModifPhoto_Click: Select Case Err.Number Case 2114 'Cas d'un type de fichier photo non supporté ... ' on sort de la procédure MsgBox "Le format de l'image n'est supporté par le contrôle image Picture", vbCritical + vbOKOnly, "Application Photos" GoTo Exit_cmdAjoutModifPhoto_Click Case 2220 'Cas d'un emplacement non valide du fichier image MsgBox "Le fichier image n'a pas été trouvé à l'emplacement indiqué : " & vbCrLf & _ Me.txtPhoto, vbCritical + vbOKOnly, "Application Photos" GoTo Exit_cmdAjoutModifPhoto_Click Case Else ' tout autre cas d'erreur MsgBox "Erreur inattendue : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "Application Photos" End Select Err.Clear Resume Exit_cmdAjoutModifPhoto_Click End Sub
oui J'ai pensé au champ texte. Bonne idée.
J'avais peur que ça ne fonctionne pas. Il devais bien y avoir une raison pour le mettre en hypertexte lors de la conception de la BD mais si ça peut régler le problème pourquoi pas.
tb_Photo (structure)
Nom Texte court
Cultivar Texte court
Photo texte long
PhotoChemin Lien Hypertexte Je copie la table et change ça pour texte long
Reprendre Photo oui/non
J'avais peur que ça ne fonctionne pas. Il devais bien y avoir une raison pour le mettre en hypertexte lors de la conception de la BD mais si ça peut régler le problème pourquoi pas.
tb_Photo (structure)
Nom Texte court
Cultivar Texte court
Photo texte long
PhotoChemin Lien Hypertexte Je copie la table et change ça pour texte long
Reprendre Photo oui/non
Pour les # voir réponse à yg_be.
Utiliser seulement le champ Photo: J'ai pensé à ça aussi. Apparemment que ça a été fait comme ça parce qu'il y avait des problèmes pour charger les photos autrement. Ça pourrait valoir la peine de tester à nouveau avec la nouvelle version de Windows et d'access.
Merci.
Je viens de tester ça et les photos ne s'affichent pas si elles sont déjà dans la base de données, seulement quand on en ajoute. Par contre il n'y a plus d'erreur 2220.
La structure de tb_photo est devenue
Nom Texte court
Cultivar Texte court
Photo texte long
FichierPhotoIntrouvable oui/non
Reprendre Photo oui/non
La fonction au changement d'enregistrement est devenue
La fonction pour ajouter une photo est devenue
La fonction à l'ouverture de la base de donnée ne s'occupe plus des photos et est devenue
Donc il reste un détail, et non pas le moindre, faire afficher les photos sans lien hypertexte.
Merci tout le monde. Ça avance.
Je fouille l'internet et je vous reviendrai là-dessus.
Utiliser seulement le champ Photo: J'ai pensé à ça aussi. Apparemment que ça a été fait comme ça parce qu'il y avait des problèmes pour charger les photos autrement. Ça pourrait valoir la peine de tester à nouveau avec la nouvelle version de Windows et d'access.
Merci.
Je viens de tester ça et les photos ne s'affichent pas si elles sont déjà dans la base de données, seulement quand on en ajoute. Par contre il n'y a plus d'erreur 2220.
La structure de tb_photo est devenue
Nom Texte court
Cultivar Texte court
Photo texte long
FichierPhotoIntrouvable oui/non
Reprendre Photo oui/non
La fonction au changement d'enregistrement est devenue
Private Sub Form_Current() ' L'événement Activation (Current) se produit lorsque le focus passe à un enregistrement ' donné pour en faire l'enregistrement en cours, ou lorsque le formulaire est ' Actualisé ou en Actualisation. ' si le chemin vers la photo est non vide : on visualise un enregistrement ' sinon cela indique que nous sommes sur un enregistrement vierge, donc en cours de saisie. ' Me.Caption : gère le titre du formulaire. Dim stDir As String ' Gestion des erreurs On Error GoTo Err_Form_Current 'Effacer la photo avant de passer à l'enregistrement suivant sinon elle reste Me.imgPhoto.Picture = CurrentProject.Path & "\blank.jpg" ' si la photo n'est pas définie, on affiche la photo blank.jpg ' CurrentProject.Path : est le chemin de l'application If Len(Me.txtPhoto) > 0 Then stDir = Dir(Me.txtPhoto) If stDir <> "" Then Me.imgPhoto.Picture = CurrentProject.Path & "\" & Me.txtPhoto End If End If DisplayPhoto Exit_Form_Current: Exit Sub Err_Form_Current: Select Case Err.Number Case 2114 'Cas d'un type de fichier photo non supporté ... MsgBox "Le format de l'image n'est supporté par le contrôle image Picture", vbCritical + vbOKOnly, "Application Photos" Me.imgPhoto.Picture = CurrentProject.Path & "\images\blank.jpg" 'Me.txtPhoto = vbNullString Case 2220 'Cas d'un emplacement non valide du fichier image MsgBox "Le fichier image n'a pas été trouvé à l'emplacement indiqué : " & vbCrLf & _ Me.txtPhoto, vbCritical + vbOKOnly, "Application Photos" Me.imgPhoto.Picture = CurrentProject.Path & "\blank.jpg" stSQL = "UPDATE tb_Photo SET FichierPhotoIntrouvable = TRUE WHERE Nom = '" & Me.Nom & _ "' AND Cultivar = '" & Me.Cultivar & "'" Case Else ' tout autre cas d'erreur MsgBox "Erreur inattendue : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "Application Photos" End Select Err.Clear Resume Exit_Form_Current End Sub
La fonction pour ajouter une photo est devenue
Private Sub cmdAjoutModifPhoto_Click() ' Bouton d'ajout - modification de photo Dim strLink As String Dim stPhoto As String 'Ce qu'il faut conserver du chemin dans la base de données Dim stSQL As String Dim stTitre As String On Error GoTo err_cmdAjoutModifPhoto_Click stTitre = "Choisissez une photo de " & Me.Parent!Nom & " " & Me.Parent!Cultivar ' récupération du chemin physique de la photo ' par la boite de dialogue strLink = modFichiers.ChoisirFichier(stTitre) ' si la boite renvoie une adresse non nulle If Len(strLink) > 0 Then ' tentative d'affichage de la photo Me.imgPhoto.Picture = strLink 'Sauvegarde d'une portion du chemin relative au projet dans la base de données iPos = Len(CurrentProject.Path) stPhoto = Right(strLink, Len(strLink) - iPos - 1) Me.txtPhoto = stPhoto DoEvents If Me.Dirty Then Me.Dirty = False End If DisplayPhoto Exit_cmdAjoutModifPhoto_Click: Exit Sub err_cmdAjoutModifPhoto_Click: Select Case Err.Number Case 2114 'Cas d'un type de fichier photo non supporté ... ' on sort de la procédure MsgBox "Le format de l'image n'est supporté par le contrôle image Picture", vbCritical + vbOKOnly, "Application Photos" GoTo Exit_cmdAjoutModifPhoto_Click Case 2220 'Cas d'un emplacement non valide du fichier image MsgBox "Le fichier image n'a pas été trouvé à l'emplacement indiqué : " & vbCrLf & _ Me.txtPhoto, vbCritical + vbOKOnly, "Application Photos" GoTo Exit_cmdAjoutModifPhoto_Click Case Else ' tout autre cas d'erreur MsgBox "Erreur inattendue : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "Application Photos" End Select Err.Clear Resume Exit_cmdAjoutModifPhoto_Click End Sub
La fonction à l'ouverture de la base de donnée ne s'occupe plus des photos et est devenue
Private Sub Form_Load() Dim stMsg As String On Error GoTo Err_Form_Load optComplet = False optVente = False Exit_Form_Load: Set rstPh = Nothing Exit Sub Err_Form_Load: stMsg = "En ouvrant le menu principal," & vbCrLf & Err.Number & ": " & Err.Description MsgBox stMsg, vbExclamation, "Erreur" Resume Exit_Form_Load End if
Donc il reste un détail, et non pas le moindre, faire afficher les photos sans lien hypertexte.
Merci tout le monde. Ça avance.
Je fouille l'internet et je vous reviendrai là-dessus.
Si je peux ajouter mon grain de sel !
Pourquoi entrer le chemin dans un champ, que ce soit texte ou hypertexte, puisque de toute façon le chemin est gardé en mémoire pendant toute la procédure et effacé à la fermeture?
Par ailleurs, tu te demandais pourquoi le format était hypertexte et non pas texte. Il faut faire attention parce que le champ d'un texte est limité à 252 caractères, ce qui n 'est pas le cas d'un champ hypertexte, et si la procédure est utilisée par des ordis différents le chemin sera différent et tu dois prévoir toutes les configurations possibles, d'où l'avantage d'un lien hypertexte. Mais c'est justement une difficulté que tu évites en gardant le lien en mémoire dans la procédure, parce que là tu n'as pas cette limite du nbre de caractères.
Pourquoi entrer le chemin dans un champ, que ce soit texte ou hypertexte, puisque de toute façon le chemin est gardé en mémoire pendant toute la procédure et effacé à la fermeture?
Par ailleurs, tu te demandais pourquoi le format était hypertexte et non pas texte. Il faut faire attention parce que le champ d'un texte est limité à 252 caractères, ce qui n 'est pas le cas d'un champ hypertexte, et si la procédure est utilisée par des ordis différents le chemin sera différent et tu dois prévoir toutes les configurations possibles, d'où l'avantage d'un lien hypertexte. Mais c'est justement une difficulté que tu évites en gardant le lien en mémoire dans la procédure, parce que là tu n'as pas cette limite du nbre de caractères.
Ok J'ai trouvé pourquoi et mon code est maintenant. Donc si je vais sur un enregistrement, la photo n'affiche pas toujours mais si je la recharge et que je ferme la BD, elle affiche quand j'ouvre la BD à nouveau. Donc il reste à recharger les photos récalcitrantes.
Merci tout le monde!!!!
Je suis tellement contente!!!!!
A+
Merci tout le monde!!!!
Je suis tellement contente!!!!!
Private Sub Form_Current() ' L'événement Activation (Current) se produit lorsque le focus passe à un enregistrement ' donné pour en faire l'enregistrement en cours, ou lorsque le formulaire est ' Actualisé ou en Actualisation. ' si le chemin vers la photo est non vide : on visualise un enregistrement ' sinon cela indique que nous sommes sur un enregistrement vierge, donc en cours de saisie. ' Me.Caption : gère le titre du formulaire. Dim stDir As String Dim stChemin As String ' Gestion des erreurs On Error GoTo Err_Form_Current 'Effacer la photo avant de passer à l'enregistrement suivant sinon elle reste Me.imgPhoto.Picture = CurrentProject.Path & "\blank.jpg" ' si la photo n'est pas définie, on affiche la photo blank.jpg ' CurrentProject.Path : est le chemin de l'application If Len(Me.txtPhoto) > 0 Then stChemin = CurrentProject.Path & "\" & Me.txtPhoto stDir = Dir(stChemin) If stDir <> "" Then Me.imgPhoto.Picture = stChemin End If End If DisplayPhoto Exit_Form_Current: Exit Sub Err_Form_Current: Select Case Err.Number Case 2114 'Cas d'un type de fichier photo non supporté ... MsgBox "Le format de l'image n'est supporté par le contrôle image Picture", vbCritical + vbOKOnly, "Application Photos" Me.imgPhoto.Picture = CurrentProject.Path & "\images\blank.jpg" 'Me.txtPhoto = vbNullString Case 2220 'Cas d'un emplacement non valide du fichier image MsgBox "Le fichier image n'a pas été trouvé à l'emplacement indiqué : " & vbCrLf & _ Me.txtPhoto, vbCritical + vbOKOnly, "Application Photos" Me.imgPhoto.Picture = CurrentProject.Path & "\blank.jpg" stSQL = "UPDATE tb_Photo SET FichierPhotoIntrouvable = TRUE WHERE Nom = '" & Me.Nom & _ "' AND Cultivar = '" & Me.Cultivar & "'" Case Else ' tout autre cas d'erreur MsgBox "Erreur inattendue : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "Application Photos" End Select Err.Clear Resume Exit_Form_Current End Sub Sub DisplayPhoto() 'DisplayPhoto est la sub d'affichage des photos dans le contrôle Image appelé : imgPhoto. 'Cette procédure ajuste l'affichage de la photo au cas où ses dimensions dépasseraient celles du contrôle photo. 'Me.imgPhoto.ImageHeight : donne la hauteur de la Photo (Fichier .jpg par exemple) 'Me.imgPhoto.Height : donne la hauteur du contrôle d'affichage. ' Traitement en fonction de la taille de l'image ' regarde si la hauteur de l'image dépasse celle du controle Picture If Me.imgPhoto.ImageHeight > Me.imgPhoto.Height Then ' met le controle en mode zoom (3) Me.imgPhoto.SizeMode = 3 'Me.imgPhoto.SizeMode = 0 Else ' met le contrôle en mode respect de la taille originale Me.imgPhoto.SizeMode = 0 End If ' si la largeur dépasse et qu'on est en mode taille réelle ... If (Me.imgPhoto.ImageWidth > Me.imgPhoto.Width) And (Me.imgPhoto.SizeMode) = 0 Then ' on met en mode zoom Me.imgPhoto.SizeMode = 3 'Me.imgPhoto.SizeMode = 0 End If End Sub
A+
Hypertexte à texte: J'ai enlevé plein de # hier dans le champ Photo. Impossible de les enlever avec l'outil de recherche, il ne les trouvait pas. Rien ne fonctionnait avant ce ménage. J'en ai ragé un coup. Ma copie contient plusieurs centaines d'enregistrement.