2010-09-14 9 views
9

J'ajoute plusieurs lignes à une grille de chaînes à partir d'un fichier CSV @ runtime, Cependant le StringGrid semble scintiller beaucoup quand il est en cours, je suppose qu'il y aurait une commande beginupadate/Endupdate pour l'arrêter. Cependant je ne peux pas le trouver. Existe-t-il un autre moyen d'arrêter le scintillement lorsque l'ID de grille est mis à jour.Delphi TStringGrid Flicker

Colin

Répondre

1
Ce sont des méthodes de l'objet `TStrings`. Utilisez StringGrid1.Rows [i]/Cols [i] .BeginUpdate; ... StringGrid1.Rows [i]/Cols [i] .EndUpdate;

Mise à jour

Avez-vous essayé de mettre DoubleBuffered := true?

+0

C'est ce que je pensais, mais j'utilise Delphi 7 et cela ne semble pas être pris en charge. – colin

+0

Cela aide cependant les barres de défilement clignotent encore – colin

+2

Maintenant que je regarde à travers le code, il est évident pour moi que le 'TStringGrid' n'est pas le meilleur contrôle sur la planète. Une chose que je n'aime vraiment pas avec ce contrôle, c'est qu'il n'est pas sur le thème - il semble étrange dans une application à thème. Etes-vous sûr que vous ne pouvez pas faire avec 'TListView'? –

-2

Vous pouvez utiliser la fonction Windows LockWindowUpdate (AHandle) pour empêcher l'actualisation du contrôle, puis LockWindowUpdate (0) pour le repeindre.

Lorsque le handle passe le Grid.Handle.

+5

[Avec quelles opérations LockWindowUpdate doit-il être utilisé?] (Http://blogs.msdn.com/b/oldnewthing/archive/2007/02/21/1735472.aspx) [Avec quelles opérations LockWindowUpdate ne doit pas être utilisé utilisé?] (http://blogs.msdn.com/b/oldnewthing/archive/2007/02/22/1742084.aspx) Utilisez ['wm_SetRedraw'] (http://msdn.microsoft.com/fr-fr /library/dd145219.aspx) à la place. –

+0

OK, alors vous devriez le mettre comme une réponse pas un commentaire –

+1

Je pense que Rob vous expliquait pourquoi votre réponse était fausse et être downvoted, et donc son commentaire était correctement un commentaire (à vous). –

2

Oui, il n'y a pas BeginUpdate/EndUpdate dans TStringGrid, mais il est par rangée ou par colonne:

StringGrid1.Rows[0].BeginUpdate;
StringGrid1.Cols[0].BeginUpdate;

+0

ça marche? surtout si le gird est re-rempli en utilisant .Cells? –

14

Mieux vaut tard que jamais ... J'utilise WM_SETREDRAW. Par exemple:

... 
StringGrid1.Perform(WM_SETREDRAW, 0, 0); 
try 
    // StringGrid1 is populated with the data here 
finally 
    StringGrid1.Perform(WM_SETREDRAW, 1, 0); 
    StringGrid1.Invalidate; // important! to force repaint after all 
end; 
...