La vidange de la chaîne de grille en Delphi
En Delphi, il est un moyen rapide de vider un TStringgrid (contenant plus de 5000 lignes) qui permettra également de libérer de la mémoire?
Paramètre le nombre de lignes à 1, vide la grille, mais ne libère pas la mémoire.
Merci d'avance,
Paul
Quel est le problème avec la mémoire? Réglage du nombre de lignes à 1 ne libère pas la mémoire, mais, selon moi, cette mémoire est utilisée à nouveau quand vous renouvelez les lignes. Si vous souhaitez libérer de la mémoire, libre le TStringGrid une re-Créer.
OriginalL'auteur Paul Jones | 2011-11-11
Vous devez vous connecter pour publier un commentaire.
Cela devrait annuler l'initialisation de la alloués à cordes (à partir de la liste de chaînes où la ligne de textes sont stockés). Le nettoyage est effectué par des colonnes puisque vous avez beaucoup de lignes.
OriginalL'auteur TLama
Je suggère de stockage de votre chaîne de valeurs dans votre mémoire que vous avez le plein contrôle, et ensuite utiliser un TDrawGrid, ou mieux un virtuel TListView, pour afficher le contenu de la mémoire nécessaire.
OriginalL'auteur Remy Lebeau
Par "ne libère pas la mémoire", tu veux dire que si vous définissez
RowCount := 1
, puis définissez laRowCount := 10' you can still see the old content of the
des Cellules?Si oui, c'est un vieux problème et n'a rien à voir avec la mémoire ne s'en aille pas; c'est tout simplement parce que vous venez d'arriver à voir le contenu précédent de la mémoire quand il est alloué à nouveau, parce que la mémoire n'est pas zéro suite.
J'ai un assez standard de routine dans un utilitaire unité qui traite de ce visuel glitch, et à moins que la grille est énorme fonctionne assez rapide. Il suffit de passer le
TStringGrid
avant vous modifiez leRowCount
ouColCount
à une valeur inférieure.L'utiliser comme ceci:
RowCount
et puisClearStringGrid
? Vous n'êtes pas le verrouillage de la mise à jour parBeginUpdate
/EndUpdate
et il peut clignoter.En fait, non. 🙂 Si vous modifiez la
RowCount
tout d'abord, vous n'avez pas accès à la vieille lignes afin de les effacer. Vous avez raison bien sur oublierBegin/EndUpdate
; mon code est sur une autre machine, et j'ai oublié. Fixe. 🙂Il n'y a pas
TStringGrid.BeginUpdate
ouTStringGrid.EndUpdate
😉 Mais vous pouvez y accéder soitRows
ouCols
et parce que l'OP a dit qu'il a beaucoup de lignes, j'ai décidé de claireCols
. Et bien sûr, vous avez raison, si vous réglez leRowCount
d'abord, puis vous itérer une seule fois dans les lignes.Vous venez de insistent j'ai corrigé le
Begin/EndUpdate
chose, n'est-ce pas? 🙂 L'a obtenu; doit avoir été vraiment fatigué hier. <g> Merci.même
Items
n'existe pas 🙂 SeulementRows
etCols
qui sontTStrings
. C'est vraiment un mauvais contrôle 😉OriginalL'auteur Ken White
Le moyen le plus rapide d'utiliser un TStringGrid est à l'aide de OnGetValue/OnSetValue.
De cette façon, seul le texte de cellules visibles sont demandés de façon dynamique.
Ajout et suppression de lignes est alors rapide éclairage, sinon TStringgrid est
très slooow lorsque vous avez plus de 5000 dossiers.
De cette façon, je peux remplir et claire une grille avec 700.000 dossiers dans un deuxième!
OriginalL'auteur André
Lors de l'utilisation de la mémoire est l'argument critique, envisager d'utiliser une autre grille. Par exemple, NLDStringGrid qui est (re)écrit par moi-même, et qui a une propriété appelée
MemoryOptions
. Il contrôle si les données peuvent être conservées au-delà deColCount * RowCount
, si le stockage est proportionnelle (moins d'utilisation de la mémoire pour que partiellement rempli de lignes et de colonnes), que ce soit pour stocker lesCols
etRows
de la propriété des résultats et si les données sont stockées de manière éparse.Pour effacer une telle grille qui a
moBeyondGrid
exclus de la mémoire options, réglageRowCount
àFixedRows
suffit.Il est open source et téléchargeable à partir d'ici.
OriginalL'auteur NGLN