2010-09-14 14 views
9

Ich füge mehrere Zeilen zu einem String Grid aus einer CSV-Datei @ runtime, aber das StringGrid scheint zu flackern, wenn es hochgeladen wird, ich vermutete, es gäbe einen beginupadate/Endupdate Befehl, um dies zu stoppen. Aber ich kann es nicht finden. Gibt es eine andere Möglichkeit, das Flimmern zu stoppen, wenn die Grid-ID aktualisiert wird.Delphi TStringGrid Flicker

Colin

Antwort

1
Dies sind Methoden des `TStrings` Objekt. Verwendung StringGrid1.Rows [i]/Cols [i] .BeginUpdate; ... StringGrid1.Rows [i]/Cols [i] .EndUpdate;

aktualisieren

Haben Sie versucht DoubleBuffered := true zu setzen?

+0

Das ist was ich dachte, aber ich benutze Delphi 7 und das scheint nicht unterstützt zu werden. – colin

+0

Das hilft jedoch die Bildlaufleisten immer noch flackern – colin

+2

Nun, da ich den Code durchschaue, ist es für mich offensichtlich, dass das 'TStringGrid' nicht die beste Kontrolle auf dem Planeten ist. Eine Sache, die ich mit diesem Steuerelement wirklich nicht mag, ist, dass es nicht thematisch ist - es sieht in einer thematischen Anwendung seltsam aus. Sind Sie sicher, dass Sie mit einem 'TListView' nicht können? –

-2

Sie können die Windows-Funktion LockWindowUpdate (AHandle) verwenden, um das Aktualisieren des Steuerelements zu verhindern, und anschließend LockWindowUpdate (0), um es neu zu zeichnen.

Wie der Griff den Grid.Handle übergeben.

+5

[Mit welchen Operationen soll LockWindowUpdate verwendet werden?] (Http://blogs.msdn.com/b/oldnewthing/archive/2007/02/21/1735472.aspx) [Mit welchen Operationen soll LockWindowUpdate nicht gemeint sein? verwendet?] (http://blogs.msdn.com/b/oldnewthing/archive/2007/02/22/1742084.aspx) Verwenden Sie ['wm_SetRedraw'] (http://msdn.microsoft.com/en-us /library/dd145219.aspx) statt. –

+0

OK, dann sollten Sie es als eine Antwort nicht einen Kommentar setzen –

+1

Ich denke, Rob erklärte Ihnen, warum Ihre Antwort falsch war und downvoted, und damit sein Kommentar war richtig ein Kommentar (für Sie). –

2

Ja, es gibt keine Beginupdate/EndUpdate in TStringGrid, aber es gibt pro Zeile oder pro Spalte:

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

+0

funktioniert es? vor allem, wenn das Gitter mit .Cells wieder gefüllt wird? –

14

Besser spät als nie ... ich WM_SETREDRAW verwenden. Zum Beispiel:

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