Einzelnen Beitrag anzeigen

Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#19

Re: Stringgrid "schnell" beladen

  Alt 29. Jun 2009, 12:18
Hallo,
Zitat von QuickAndDirty:
Zitat von Lannes:
Hallo,
man kann RowCount auch erst nach dem Füllen der Zellen auf den endgültigen Wert setzen.
?? bist du sicher das es dann schneller ist? ich meine er müsste sich ja dann immer im moment des Schreibens speicher hohlen.
Das schreiben in Cells fordert den Speicher an, setzen von RowCount erweitert nur den Anzeigebereich.
Zeit sparst Du durch das verhindern des mehrmaligen setzen von RowCount, liegt so ca bei 25% Zeitersparnis.
Setzt Du jetzt vor dem Füllen des Grids noch StringGrid.Rows[0].BeginUpdate; und nach dem das Grid gefüllt ist StringGrid.Rows[0].EndUpdate; sparst du nochmal ca. 10%.

Zitat von QuickAndDirty:
Zitat von Lannes:
Abgesehen davon ist der Ansatz von Satty67 das schnellste, keine Daten ins Grid setzen, nur die Werte über onDrawCell ausgeben lassen.
das geht nicht weil es eine universell Einsetztbare (ist auch überall bei uns eingesetzt) Komponente sein soll...es ist keine Datenbank Komponente.
Und es gibt das Problem "Große Datenmengen flexibel verwalten" dann eben nur wo anders.
aber dann ist es wesentlich schneller z.B. mit TList.

Zitat von QuickAndDirty:
Zitat von Satty67:
StringGrid.RowCount für jede einzelne Zeile erhöhen ist sehr langsam. Sieht so aus, als ob Du die Datenmenge nicht weiter filterst, also könntest Du RowCount gleich am Anfang auf den maximalen Wert setzen.

Dann wenn DataSet wärend der Anzeige des Grid die Datenmenge behält, könntest Du selber das Grid nur mit den sichtbaren Zellen "zeichnen". StringGrid.RowCount := 2.000.000 dauert nur ein paar ms und wenn du das Grid nicht wirklich füllst, gibt es keine weitere Verzögerung.
Das ist schon mal eine Praktische Sache... Aber Füllen muss ich es wohl, weil ich sonnst das ganzen Inkremtelle suche beim tippen etc. ändern muss. (Das Grid wird als Dropdownlist missbraucht)
und gerade da wird es langsam, bzw. deswegen nutze ich immer eine Datenspeicherung außerhalb des Grids und schreib nur den Index der Suchergebnisse in das Grid, der dann in OnDrawCell gelesen, der entsprechende Datensatz(bzw. Feld) aus meiner Datenspeicherung geholt und gezeichnet wird.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat