Bonjour à tous et merci de votre temps et de votre aide.
J'ai un problème assez bizare sur une de mes applications.
J'ai un sous-formulaire que affiche 6 images parmis une liste d'images.
Cette liste peut contenir de 0 à environ 500 images actuellement.
Ces images sont associées à une référence et j'ai environ 30 000 références.
Le but est de permettre à l'utilisateur de visualiser ses images par pages de 6 une fois la référence choisie.
Ceci est pour remplacer la librarie de arkham46 :
Le contrôle Liste d'images - CtrlImageList
https://arkham46.developpez.com/arti...ctrlimagelist/
qui fait bien plus que ce dont j'ai besoin et qui nécessite l'utilisation d'un fichier externe et qui est plus lente à l'affchage que ma solution.
Au départ j'utilisais une collection de modules de classe (objet en VBA) pour stoker en mémoire cette liste.
Ensuite, à cause de bugs, j'en suis venu à utiliser un recordset ADO déconnecté.
Et comme cela bugait aussi, j'ai finalement utiliser 4 tableaux en parallèles.
Dans toutes les solutions, je ne stocke que le chemin d'accès à l'image qui est ensuite chargée dans un contrôle image.
Donc à un momment données je n'ai "physiquement" au maximum que 6 images.
Dans tous les cas j'ai eu des bugs très étranges après "certain nombre" d'affichages, les pires ont été avec le recordset ADO.
Le certain temps semble relié à la taille des images. Si mes images sont grosses, il survient plus tôt, sinon plus tard mais jamais toujours au même endrois.
Dans ma 1ère solutons avec la collection, Access mélange joyeusement les images entre les références. Ex, il m'affiche 3 images d'une référence, 4 d'une autre et parfois certaines de la référence choisie.
Dans la 2nd solution avec le recordser, Access retourne des informations incohérentes comme le fait que le recordset est fermé alors que mon code demande de l'ouvrir 2 ligne plus tôt.
Dans la 3ième, Access semble ignorer ou ne pas compléter mes redimentionnement de tableau.
Ex : je demande un redim de 1 à 4 et Access ne redimensionne que de 1 à 2.
Si je passe en mode débug, et que je ramène l'execution en arrière puis exécute pas à pas, la redimension se fait bien, donc pas de bugs dans le code lui-même.
Bref on dirait que Access "sous-traite" la gestion de la mémoire à Windows mais qu'il n'attend pas que cette gestion soit complétée pour continuer ce qui fait que le code et l'objet en mémoire ne sont pas synchrone.
Note qu'ajouter un après les redim DoEvent ne change rien.
J'aimerai savoir si quelqu'un a déjà rencontré et solutionné ce genre de problème.
à toute fin utilise voici un extrait du code que j'utilise.
Les variables de module :
Zone du bug :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Option Compare Database Option Explicit Private m_ListeImage_Support() As String Private m_ListeImage_Repertoire() As String Private m_ListeImage_Nom() As String Private m_ListeImage_Extension() As String Const NUM_IMAGE_PAGE As Long = 6
C'est dans cette portion de code que le bug se manifeste, au moment du chargement après les redim.
Si vous avez de question n'hésitez pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 Public Sub ChargerImage(prmRImage As dao.Recordset) 'Attention cette procédure modifie ses paramètres '=== Détermine le nombre d'images Dim nbImage As Long If Not prmRImage.EOF Then prmRImage.MoveLast End If nbImage = prmRImage.RecordCount If prmRImage.RecordCount <> 0 Then prmRImage.MoveFirst End If '--- Détermine le nombre d'images '=== Dimentionne les tableaux pour y stocker les chemins d'accès. If nbImage <> 0 Then ReDim m_ListeImage_Support(1 To nbImage) ReDim m_ListeImage_Repertoire(1 To nbImage) ReDim m_ListeImage_Nom(1 To nbImage) ReDim m_ListeImage_Extension(1 To nbImage) Else ReDim m_ListeImage_Support(0) ReDim m_ListeImage_Repertoire(0) ReDim m_ListeImage_Nom(0) ReDim m_ListeImage_Extension(0) End If '--- Dimentionne les tableaux pour y stocker les chemins d'accès. Call EffacerPage 'Vide les contrôles images utilisés pour l'affichage. Me.NumPage = 0 Me.NumMaxPage = 0 Dim infoImage As CInfoFichier '=== Charge les images Dim numSequence As Long: numSequence = 0 Do While Not prmRImage.EOF Set infoImage = New CInfoFichier infoImage.SupportRepertoire = prmRImage![RepertoireImage] infoImage.NomExtension = prmRImage![Image] numSequence = numSequence + 1 m_ListeImage_Support(numSequence) = infoImage.Support m_ListeImage_Repertoire(numSequence) = infoImage.repertoire m_ListeImage_Nom(numSequence) = infoImage.Nom m_ListeImage_Extension(numSequence) = infoImage.Extension Set infoImage = Nothing prmRImage.MoveNext Loop '--- Charge les images '=== Calcul le nombre de pages ' Arrondi au dessus If numSequence Mod NUM_IMAGE_PAGE = 0 Then Me.NumMaxPage = numSequence \ NUM_IMAGE_PAGE Else Me.NumMaxPage = (numSequence \ NUM_IMAGE_PAGE) + 1 End If '--- Calcul le nombre de pages If Me.EstAvecImage Then Me.NumPage = 1 End If Call NumPage_AfterUpdate Exit_ChargerImage: Exit Sub End Sub
Bonne année.
Partager