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

C++Builder Discussion :

StringGrid avec Image dans chaque Cellule : Problème de mémoire.


Sujet :

C++Builder

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Points : 4
    Points
    4
    Par défaut StringGrid avec Image dans chaque Cellule : Problème de mémoire.
    Bonjour,
    J’utilise actuellement C++ Builder version 5.
    Suite à différentes recherches et différents tests je me permets de venir vous poser mes questions ici.

    J’effectue actuellement une application nécessitant un StringGrid.
    Au sein de celui-ci j’affiche des images à l’aide de Canvas et d’image enregistré en bitmap sur chacune des cellules.

    Mon problème est que le chargement de mon image se fait au sein de mon StringGrid1DrawCell. Ce qui fait qu’au bout d’un moment j’ai un problème avec la taille mémoire.
    (Je peux effectuer un zoom sur ma StringGrid et j'ai alors accès à la ScrollBar mais celle-ci actualise à chaque fois les images).

    J'ai donc essayé:
    - De fixer les colonnes et les lignes, solution qui semble fonctionner mais si je zoom je n'ai plus l'accès à ma scrollbar.
    - De définir mes images à d'autres endroits mais on me dit qu'elles ne sont pas définis si je fais ainsi.
    - De delete complètement la stringgrid mais cela ne libère pas de la mémoire.
    - Mettre une condition dans mon DrawCell pour passer une fois dans la déclaration et ne plus y passer par la suite mais sans succès.
    - De définir mes images dans un autre .h

    J'ai l'impression que mes images ne sont pas supprimés à chaque fois et s'accumule. Si mes lignes et colonne ne sont pas fixé et si je clique par exemple sur ma cellule [40][40] Je recharge toutes les cellules jusqu'à [40][40].

    Voilà le code de mon DrawCell:
    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
    76
    77
    78
    79
    80
    81
    82
    83
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int Col,
          int Row, TRect &Rect, TGridDrawState State)
    {
            Graphics::TBitmap *GreenLightBmp = new Graphics::TBitmap;
            GreenLightBmp->LoadFromFile("GreenLight.bmp" );
            //Image par défault du bouton vert
     
            Graphics::TBitmap *GreenLightBmpX2 = new Graphics::TBitmap;
            GreenLightBmpX2->LoadFromFile("GreenLightBmpX2.bmp" );
            //Image par défault du bouton vert en zoom 2
     
            Graphics::TBitmap *GreenLightBmpdiv2 = new Graphics::TBitmap;
            GreenLightBmpdiv2->LoadFromFile("GreenLightBmpdiv2.bmp" );
            //Image par défault du bouton vert en zoom 4
     
            Graphics::TBitmap *GreenLightBmpdiv4 = new Graphics::TBitmap;
            GreenLightBmpdiv4->LoadFromFile("GreenLightBmpdiv4.bmp" );
            //Image par défault du bouton vert en zoom 5
     
     
            Graphics::TBitmap *BlankBmp = new Graphics::TBitmap;
            BlankBmp->LoadFromFile("Blank.bmp");
            //Image par défault du bouton gris
     
            Graphics::TBitmap *BlankX2 = new Graphics::TBitmap;
            BlankX2->LoadFromFile("BlankX2.bmp");
            //Image par défault du bouton gris  X2
     
            drawtest++;
            Label3->Caption=drawtest;  //Compteur et affichage de ce dernier
     
     
     
        if ( Col == 0 || Row == 0 ) return;  //On ne veut pas toucher à la première colonne ou à la première ligne.
     
        if ( StringGrid1->Cells[Col][Row]!=0)//.ToInt() != 0 )
        //Si on est pas = 0 en dehors de col=0 et row=0 on draw un bouton vert.
        {
            if (Col<=maxcolonne)
            {
                if (origine==3)
                {
                    StringGrid1->Canvas->Draw(Rect.Left, Rect.Top,GreenLightBmp);
                }
                else
                {
                    if(origine>3)
                    {
                        StringGrid1->Canvas->Draw(Rect.Left, Rect.Top,GreenLightBmpX2);
                    }
                    else
                    {
                        if(origine==2)
                        {
                            StringGrid1->Canvas->Draw(Rect.Left, Rect.Top,GreenLightBmpdiv2);
                        }
                        else
                        {
                            StringGrid1->Canvas->Draw(Rect.Left, Rect.Top,GreenLightBmpdiv4);
                        }
                    }
                }
            }
        }
        else
        {
            if(origine>3)
            {
                StringGrid1->Canvas->Draw(Rect.Left, Rect.Top, BlankX2 );
            }
            else
            {
                StringGrid1->Canvas->Draw(Rect.Left, Rect.Top, BlankBmp );
            }
        }
     
    delete BlankBmp;
    delete BlankX2;
    delete GreenLightBmpdiv4;
    delete GreenLightBmpdiv2;
    delete GreenLightBmpX2;
    delete GreenLightBmp;
    }


    Je vous remercie d'avoir lu. Si vous avez besoin d'informations complémentaires il n y a pas de problème.

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Rajout de 4 StringGrid pour combler le problème
    J'ai essayé une autre solution.
    En effet j'ai maintenant 5 StringGrid.
    Ils ont tous une taille différente mais en fonction de la valeur de mon "zoom" je peux modifier celui que je veux et les images s'actualisent sans problème entre les cellules.
    Je ne suis pas en taille fixe et je n'ai aucun problème mémoire.

    J'ai un problème mémoire qui subvient à deux moments:
    - Si j'utilise la ScrollBar d'un StringGrid il actualise les images qui sont dedans (sans effacer les anciennes ?) et accumule donc de la taille mémoire.
    - Si je fais apparaître le stringgrid adapté au zoom et que je cache les autres pendant ce temps lorsqu'il vont réapparaite ils vont se réactualiser et prendre de la taille mémoire.
    (Pour mieux comprendre la deuxième ligne:
    Si Zoom = 0 je cache tous les StringGrid sauf le 1. Quand je vais passer le zoom à 1 StringGrid1 ne va plus être visible mais StringGrid2 le sera. Sauf que StringGrid2 va se voir totalement recharger alors que je le cache juste)

    Si vous avez une explication (ou besoin de plus d'informations), je suis preneur! Merci !

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Ton code n'est pas bon.
    Il ne faut pas créer et charger tes bitmaps dans cette méthode, même si tu "delete" en sortie.
    Il faut les déclarer en global et les créer dans le constructeur de TForm1 par exemple et utiliser un pointeur vers ces bitmaps.
    On les supprime au moment où l'on ferme le programme (dans la OnClose ...).

    Dans ta méthode, j'ai comme l'impression que la fuite de mémoire vient de ton return (tu ne passes plus par les delete ...)!

    A plus !

Discussions similaires

  1. Réponses: 8
    Dernier message: 14/04/2013, 10h43
  2. problème avec images dans la base de données
    Par zidane2 dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 04/08/2010, 11h54
  3. [SWT] Problème avec images dans Table
    Par dalma dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 06/11/2009, 16h25
  4. Problème avec image dans JPanel
    Par littleshrimp dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 14/05/2006, 14h05
  5. [html] insertion d 1 image dans une cellule avec taille en %
    Par hijodelanoche dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 19/01/2006, 00h50

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