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:
Citation:
Code:
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.
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 :)!