IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

[Etat]Probleme affichage image dans états


Sujet :

IHM

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Points : 9
    Points
    9
    Par défaut [Etat]Probleme affichage image dans états
    Bonjour, je suis confronté à un probleme de limitations mémoire vive.
    Explications : sur la base du tutoriel de caféine pour la gestion des images et leur affichage dans les formulaires et/ou états, tout se déroulait bien jusque là.
    Mon état qui est en fait un rapport de mission qui regroupe autant des croquis que des photos ou des documents scannérisés n'affiche plus les images à partir de la 16e ou 17e page du rapport final.

    Pour préciser mes observations, cette mission est assez lourde (elle contient beaucoup de documents liés) et la mémoire vive et virtuelle du PC est énormément sollicitée (à partir de 1.34 Go de mémoire vive / virtuelle utilisée, les images ne s'affichent plus dans mon état.

    Structure de mon rapport (état) : les photos apparaissent, puis les croquis, puis les premiers documents scannérisés et dès que la mémoire atteint environ 1.34 go, l'affichage des images cesse de fonctionner. parfois même la génération de l'état s'arrête.

    Je suis dans une impasse et solicite vos lumières afin d'éclairer ma lanterne.

    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 554
    Points
    24 554
    Par défaut
    Bonjour,

    Effectivement les images sont gourmandes en mémoire.

    Faire un test d'impression sans aperçu.
    Découper ton état initial en plusieurs états en les fermant au fur et à mesure de l'impression (visu, impression, fermeture...)

    Cordialement,

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Effectivement, le découpage en plusieurs états est peut-être la solution que je vais devoir adopter, mais j'ai un impératif de pagination de bout en bout du rapport..

    Est-ce-que je ne vais pas alors perdre cette pagination en découpant mon formulaire ?S'il existe une solution, peut-être en avez vous le début pour m'ouvrir la voie ?


    Merci par avance .

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 554
    Points
    24 554
    Par défaut
    Une solution à tester est de lancer l'état suivant lors de l'impression du pied de formulaire du courant. Zone pied de formulaire évenement Sur Impression.

    On peut affecter un numéro de page à la variable Page. Par contre pour le nombre de page ce n'est pas sur.

    à vérifer.

  5. #5
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Bjr,

    Le petit problème avec les images c'est que l'image complète reste en mémoire même si elle est réduite à l'affichage...
    Si tes images font par exemple 2048 pixels de large et que ton contrôle ne fait que 200 pixels, il peut être très utile de réduire la taille de l'image avant de l"injecter dans le contrôle.
    C'est le but de la procédure ci-dessous.

    Dans l'événement Sur formattage de l'état, au lieu de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Image0.Picture = "C:\Chemin\MonImage.JPG"
    tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChargeImageReduite "C:\Chemin\MonImage.JPG", Me.Image0
    La procédure ChargeImageReduite charge l'image complète en mémoire puis la redimensionne à la largeur du contrôle avant de l'injecter dans ce contrôle.
    Au final le gain de mémoire est énorme (ça dépend de la taille des images et des contrôles bien sûr)
    Mieux encore, c'est sensiblement plus rapide!!

    A tester dans ton cas, en espérant que ça te débloque.

    Code à mettre dans un module : 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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
     
    Option Compare Database
    Option Explicit
     
    '***************************************************************************************
    '*                                       API                                           *
    '***************************************************************************************
    ' GDI
    Private Declare Function SetStretchBltMode Lib "gdi32" (ByVal hdc As Long, ByVal nStretchMode As Long) As Long
    Private Declare Function StretchBlt Lib "gdi32" _
                                        (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
                                         ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, _
                                         ByVal ySrc As Long, ByVal nSrcWidth As Long, _
                                         ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
    Private Declare Function BitBlt Lib "gdi32" _
                                    (ByVal destdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
                                     ByVal nHeight As Long, ByVal srcdc As Long, ByVal xSrc As Long, ByVal ySrc As Long, _
                                     ByVal dwRop As Long) As Long
    Private Declare Function SetMapMode Lib "gdi32" (ByVal hdc As Long, ByVal nMapMode As Long) As Long
    Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
    Private Declare Function apiGetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function DPtoLP Lib "gdi32" (ByVal hdc As Long, lpPoint As PointAPI, ByVal nCount As Long) As Long
    Private Declare Function CreateCompatibleBitmap Lib "gdi32" _
                                                    (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    ' Image EMF
    Private Declare Function CreateEnhMetaFile Lib "gdi32" Alias "CreateEnhMetaFileA" _
                                               (ByVal hdcRef As Long, ByVal lpFileName As String, ByRef lpRect As Any, ByVal lpDescription As String) As Long
    Private Declare Function CloseEnhMetaFile Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function DeleteEnhMetaFile Lib "gdi32" (ByVal hemf As Long) As Long
    Private Declare Function GetEnhMetaFileBits Lib "gdi32" (ByVal hemf As Long, ByVal cbBuffer As Long, lpbBuffer As Byte) As Long
    '***************************************************************************************
    '*                                      Constantes                                     *
    '***************************************************************************************
    'Format d'images
    Private Const CF_ENHMETAFILE = 14
    ' Types pour BitBlt/StretchBlt
    Private Const SRCCOPY = &HCC0020
    ' GetDeviceCaps
    Private Const LOGPIXELSY = 90
    Private Const LOGPIXELSX = 88
    ' Diverses Constantes
    Private Const STRETCH_HALFTONE = 4          ' Mode pour StretchBlt
    Private Const MM_HIMETRIC = 3
    Private Const MM_TEXT = 1
    '***************************************************************************************
    '*                                       Types                                         *
    '***************************************************************************************
    ' Type Point pour API
    Private Type PointAPI
        x As Long
        y As Long
    End Type
    Private Type bitmap
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
    End Type
    ' Rectangle pour API
    Private Type Rect
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
    End Type
     
    '---------------------------------------------------------------------------------------
    ' Redimensionne une image avant de l'injecter dans un contrôle
    '---------------------------------------------------------------------------------------
    ' pFichier : Chemin du fichier à charger
    ' pControl : Contrôle image dans lequel on affiche l'image
    '---------------------------------------------------------------------------------------
    Public Sub ChargeImageReduite(pFichier As String, pControl As Access.Image)
    Dim lhDC As Long, lhdcref As Long
    Dim lHdcResize As Long
    Dim lOldBitmap As Long, lBitmap As Long
    Dim lImg As Object, lOldImg As Long
    Dim lngret As Long
    Dim lBmpInfo As bitmap
    Dim lrect As Rect
    Dim pt As PointAPI
    Dim lhMeta As Long
    Dim lhMetaFile As Long
    Dim lpicdata() As Byte
    Dim lWidth As Long, lHeight As Long
        ' Chargement de l'image
        lhDC = CreateCompatibleDC(0)
        Set lImg = LoadPicture(pFichier)
        apiGetObject lImg.handle, Len(lBmpInfo), lBmpInfo
        ' Sélectionne le bitmap image dans le contexte d'affichage
        lOldImg = SelectObject(lhDC, lImg)
        ' Taille de l'image
        lWidth = TwipsToPixelX(pControl.Width)
        lHeight = TwipsToPixelX(pControl.Width) / lImg.Width * lImg.Height
        ' Conversion en coordonnées HiMetric pour EMF
        pt.x = lWidth
        pt.y = lHeight
        lhdcref = GetDC(0)   ' Device contexte temporaire
        lngret = SetMapMode(lhdcref, MM_HIMETRIC)
        DPtoLP lhdcref, pt, 1
        pt.y = Abs(pt.y)
        lrect.Right = pt.x
        lrect.Bottom = pt.y
        SetMapMode lhdcref, lngret
        ' Redimensionne l'image
        lHdcResize = CreateCompatibleDC(0)
        lBitmap = CreateCompatibleBitmap(lhDC, lWidth, lHeight)
        lOldBitmap = SelectObject(lHdcResize, lBitmap)
        Call SetStretchBltMode(lHdcResize, STRETCH_HALFTONE)
        StretchBlt lHdcResize, 0, 0, lWidth, lHeight, lhDC, 0, 0, lBmpInfo.bmWidth, lBmpInfo.bmHeight, SRCCOPY
        ' Supprime l'image originale de la mémoire
        DeleteObject (SelectObject(lhDC, lOldImg))
        Set lImg = Nothing
        DeleteDC lhDC
        ' Création d'un contexte d'affichage EMF
        lhMeta = CreateEnhMetaFile(lhdcref, vbNullString, lrect, vbNullString)
        lngret = SetMapMode(lhMeta, MM_TEXT)
        lngret = SetStretchBltMode(lhMeta, STRETCH_HALFTONE)
        ' Copie directe de l'image réduite dans le MetaFile
        BitBlt lhMeta, 0, 0, lWidth, lHeight, lHdcResize, 0, 0, SRCCOPY
        ' Supprime l'image redimensionnée de la mémoire
        DeleteObject SelectObject(lHdcResize, lOldBitmap)
        DeleteDC lHdcResize
        ' Ferme le contexte d'affichage et récupère le MetaFile
        lhMetaFile = CloseEnhMetaFile(lhMeta)
        ' Libère le device contexte temporaire
        ReleaseDC 0, lhdcref
        ' Récupère la taille des données Méta
        lngret = GetEnhMetaFileBits(lhMetaFile, 0, ByVal 0&)
        ' Redimensionne le tableau de données
        ReDim lpicdata((lngret - 1) + 8)
        ' Récupère les données dans le tableau
        Call GetEnhMetaFileBits(lhMetaFile, lngret, lpicdata(8))
        ' Supprime le MétaFile
        lngret = DeleteEnhMetaFile(lhMetaFile)
        ' Type de l'image dans le tableau de données
        lpicdata(0) = CF_ENHMETAFILE
        ' Affecte les données de l'image au contrôle
        pControl.PictureData = lpicdata
    End Sub
     
    '---------------------------------------------------------------------------------------
    ' Converti les Twips en Pixels sur l'axe horizontal
    '---------------------------------------------------------------------------------------
    ' pTwipsX : Valeur à convertir en Twips
    ' Renvoie la valeur convertie en Pixels
    '---------------------------------------------------------------------------------------
    Public Function TwipsToPixelX(pTwipsX As Long) As Long
        Static Mult As Long
        Dim hdc As Long
        If Mult = 0 Then
            hdc = GetDC(0)
            Mult = 1440 / GetDeviceCaps(hdc, LOGPIXELSX)
            ReleaseDC 0, hdc
        End If
        TwipsToPixelX = CLng(pTwipsX / Mult)
    End Function
     
    '---------------------------------------------------------------------------------------
    ' Converti les Twips en Pixels sur l'axe vertical
    '---------------------------------------------------------------------------------------
    ' pTwipsY : Valeur à convertir en Twips
    ' Renvoie la valeur convertie en Pixels
    '---------------------------------------------------------------------------------------
    Public Function TwipsToPixelY(pTwipsY As Long) As Long
        Static Mult As Long
        Dim hdc As Long
        If Mult = 0 Then
            hdc = GetDC(0)
            Mult = 1440 / GetDeviceCaps(hdc, LOGPIXELSY)
            ReleaseDC 0, hdc
        End If
        TwipsToPixelY = CLng(pTwipsY / Mult)
    End Function

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Je reviens sur mon problème de chargement d'images à l'aperçu :

    Je pense que j'ai trouvé un solution qui me parait fonctionnelle...

    au lieu d'utiliser l'aperçu d'access avant d'imprimer, je génère un snap par le code sans aperçu préalable, et j'ouvre le snap ainsi créé avant de l'imprimer, ce qui me permet également d'archiver toutes mes impressions de rapport.


    Si cette solution peut satisfaire quelqu'un d'autre que moi j'en serais d'autant plus heureux.

    chris

  7. #7
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 42
    Points : 48
    Points
    48
    Par défaut
    beau module !
    malheureusement il ne marche pas avec les .jpg
    (je tourne sur Access 2007, et win 7 64bits)

    je chope une erreur des la deuxieme ligne:
    la methode LoadPicture de l'objet _Application a echoué

    D'apres la doc, la methode LoadPicture ne prend en compte que les
    .bmp
    .ico
    .rle
    .wmf


  8. #8
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Bjr,

    Citation Envoyé par kan630 Voir le message
    beau module !
    malheureusement il ne marche pas avec les .jpg
    (je tourne sur Access 2007, et win 7 64bits)

    je chope une erreur des la deuxieme ligne:
    la methode LoadPicture de l'objet _Application a echoué

    D'apres la doc, la methode LoadPicture ne prend en compte que les
    .bmp
    .ico
    .rle
    .wmf

    Etrange, ça a toujours marché chez moi avec des jpg, même sur Access 2007
    A moins que win 64 soit en cause?

    essaye de remplacer LoadPicture par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stdole.StdFunctions.LoadPicture
    (après avoir coché "Ole automation" dans outils => références)

    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.LoadPicture
    (parce que l'underscore je ne sais pas d'où il va le chercher)

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je me retrouve aussi bloque avec l'erreur 2114, concernant la mise en memoire des photos.
    Je fonctionne sur un état appelant 3 photos, j'ai 133 fiches.
    Donc 3*133=399 photos pesant au maximum 900Ko.

    Je voudrais mettre en place ChargeImageReduite, mais je suis "pourri" en VB.
    Je pense pouvoir m'en sortir avec votre aide.
    J'ai réussi a faire marcher un code pour appeler mes 3 photos:

    Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)

    Me.croquis.Picture = CurrentProject.Path & "\croquis\" & Me.Texto & ".jpg"
    Me.fotos1.Picture = CurrentProject.Path & "\fotos1\" & Me.Texto & ".jpg"
    Me.fotos2.Picture = CurrentProject.Path & "\fotos2\" & Me.Texto & ".jpg"

    End Sub

    (le champs [Texto]= nom de la foto)

    Je suis dans un module d'Objet de classe lié à l'état, Détail, Format.

    Comment dois-je integrer le code "Image Reduite"? Pouvez-vous m'aiguiller?
    Merci
    +++

  10. #10
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Bonjour,

    [QUOTE=saï saï;7449687]Comment dois-je integrer le code "Image Reduite"?
    [QUOTE]

    dans le menu : Insertion => module
    y copier le code de mon message précédent (celui "legendé" 'Code à mettre dans un module')

    puis remplacer les codes d'affectation d'image comme indiqué dans mone message précédent

  11. #11
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 789
    Points : 1 266
    Points
    1 266
    Par défaut
    Bonjour,

    J'utilise les fonctions GDI+ d'Arkham depuis pas mal de temps et même en réduisant les dimensions de mes images, j'ai un problème de mémoire.
    Comme Bibichris, j'ai des états pouvant contenir jusqu'à 4 images et ce, sur plusieurs dizaines d'états.

    Ma solution : avoir un formulaire intermédiaire pour n'avoir en aperçu avant impression qu'un lot de 10 pages d'états par 10 pages d'états.

    Je suis en office 2007 Seven 64 bits et je n'ai aucun problème avec mes images *.jpg.

    Cordialement

    Christophe

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci pour votre aide, cela fonctionne. J'ai 400photos de 100Ko max. (20Mo au total).
    POURTANT, il est vrai qu'il faut travailler avec de très petites photos sinon le problème reste (erreur 2220 chez moi).

    DONC, il serait préférable de travailler avec des photos de meilleure résolution (un peu plus lourdes) et d'afficher/imprimer l'état par groupe de 10 fiches, comme le propose Marsouin.

    J'arrive à créer un formulaire d'aperçu d'état, mais comment paramètre-t-on les lots d'enregistrements de 10 en 10?
    Je suis un peuperdu dans le code VBA.

    Merci pour votre aide,
    +++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Probleme affichage image dans ACCESS 2010
    Par Christian8021 dans le forum Access
    Réponses: 0
    Dernier message: 02/01/2014, 10h39
  2. probleme affichage image + texte dans table dynamique
    Par battit64 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 18/04/2008, 10h09
  3. Réponses: 2
    Dernier message: 12/04/2007, 08h51
  4. Probleme affichage image dans picturebox
    Par Julien1987 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/01/2007, 14h16
  5. Affichage image dans un état
    Par antoine46 dans le forum IHM
    Réponses: 1
    Dernier message: 24/08/2006, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo