2010-09-14 19 views
9

Dodaję wiele wierszy do siatki łańcuchowej z pliku CSV @ runtime, jednak StringGrid wydaje się migotać partie, gdy jest on zwiększany, zakładałem, że będzie to polecenie beginupadate/Endupdate, aby to zatrzymać. Jednak nie mogę go znaleźć. Czy istnieje inny sposób zatrzymania migotania podczas aktualizacji identyfikatora siatki?Delphi TStringGrid Flicker

Colin

Odpowiedz

1
Są sposoby `obiektu TStrings`. Użyj StringGrid1.Rows [i]/Cols [i] .BeginUpdate; ... StringGrid1.Rows [i]/Cols [i] .EndUpdate;

Aktualizacja

Czy próbowałeś ustawić DoubleBuffered := true?

+0

To jest to, o czym myślałem, ale używam Delphi 7, a to nie jest obsługiwane. – colin

+0

Dzięki temu paski przewijania nadal migoczą – colin

+2

Teraz, kiedy przeglądam kod, jest dla mnie oczywiste, że 'TStringGrid' nie jest najlepszą kontrolą na naszej planecie. Jedną rzeczą, której naprawdę nie lubię przy tej kontroli, jest to, że nie jest ona tematyczna - wygląda dziwnie w tematycznej aplikacji. Czy jesteś pewien, że nie możesz tego zrobić za pomocą 'TListView'? –

-2

Możesz użyć funkcji Windows LockWindowUpdate (AHandle), aby zapobiec odświeżeniu kontrolki, a następnie LockWindowUpdate (0), aby ją odświeżyć.

Podczas przenoszenia uchwyt Grid.Handle.

+5

[Z jakich operacji należy korzystać z LockWindowUpdate?] (Http://blogs.msdn.com/b/oldnewthing/archive/2007/02/21/1735472.aspx) [Z jakim operatorem LockWindowUpdate nie ma być used?] (http://blogs.msdn.com/b/oldnewthing/archive/2007/02/22/1742084.aspx) Użyj ['wm_SetRedraw'] (http://msdn.microsoft.com/en-us /library/dd145219.aspx). –

+0

OK, to powinieneś umieścić to jako odpowiedź, nie komentarz –

+1

Myślę, że Rob wyjaśniał ci, dlaczego twoja odpowiedź była błędna i została odrzucona, a zatem jego komentarz był poprawny (dla ciebie). –

2

Tak, nie ma BeginUpdate/EndUpdate w TStringgrid, ale nie ma na wiersz lub za kol:

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

+0

czy to działa? zwłaszcza jeśli przepasanie zostanie ponownie wypełnione przy użyciu komórek .Cell? –

14

Lepiej późno niż wcale ... używam WM_SETREDRAW. Na przykład:

... 
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; 
...