AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringgrid "schnell" beladen

Ein Thema von QuickAndDirty · begonnen am 29. Jun 2009 · letzter Beitrag vom 29. Jun 2009
Antwort Antwort
Seite 2 von 2     12   
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#11

Re: Stringgrid "schnell" beladen

  Alt 29. Jun 2009, 11:14
Zitat von DeddyH:
Zitat von QuickAndDirty:
Diese Funktionalität (BeginUpdate, EndUpdate) bietet das Stringgrid nicht.
Das StringGrid als solches nicht, aber Cols und Rows. Inwiefern Dir das etwas nützt, sei dahingestellt.
Nützt es?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#12

Re: Stringgrid "schnell" beladen

  Alt 29. Jun 2009, 11:16
Nunja, Du könntest ja höchstens zeilenweise BeginUpdate und EndUpdate einsetzen. Das könnte etwas Performance rausholen, aber vermutlich nicht wirklich messbar, es sei denn, Du hast enorm viele Spalten definiert.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#13

Re: Stringgrid "schnell" beladen

  Alt 29. Jun 2009, 11:17
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)
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#14

Re: Stringgrid "schnell" beladen

  Alt 29. Jun 2009, 11:22
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.

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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
471 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#15

Re: Stringgrid "schnell" beladen

  Alt 29. Jun 2009, 11:23
Es wär auch interessant was länger dauert, die Daten holen oder ins Grid schreiben.

wenn das holen länger dauert könntest du das ganze ja in nem extraThread machen um die Anwendung nicht zu blockieren. am besten in ne TList oder so und dann erst am Grid ausgeben
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#16

Re: Stringgrid "schnell" beladen

  Alt 29. Jun 2009, 11:29
Zitat von hoika:
Hallo,

Zitat:
leider dauert Dataset.recordcount auch lange und wird nicht überall unterstützt
Das stimmt schon
select count(*) kennt aber jede (anständige) Datenbank.

Von welcher DB reden wir denn ?
Jede! Es ist keine Datenbankkomponente. Ich biete nur verschiedene Quellen an um es zu füllen...unter anderem auch TDATASET.
( .Loadfrom*() )


Zitat von hoika:
Ich mache das immer so,
alle benötigten Datensätze in eine TList (oder ähnliches) laden
Grid.RowCount:= List.Count+1 (dada ).
Das ist ein Scherz oder? Ich meine T.List ist doch auch recht lahm oder?


Zitat von hoika:
Ausserdem weder der alte Spruch:
Wozu 16.000 Records anzeigen ?


Heiko
16000 Datensätze in das gitter zu packen ist nicht wirklich sooo Sinnvoll. Es handelt sich hierbei wohl um eine Ausnahme, da hat ein bestimmter Kunde eben soooo viel Datensätze zur Auswahl....und deswegen lahmt der Dialog auf dem die komponente liegt
wenn er erzeugt wird (dauert ca. 7 sekunden, normal ist es garnicht wahrnehmbar) ...ein cachen ist nicht erwünscht...
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#17

Re: Stringgrid "schnell" beladen

  Alt 29. Jun 2009, 11:40
Hallo,

kein Scherz.
Warum sollte TList langsam sein ?
Es wird doch intern ein Pointer-Array verwendet.


Heiko
Heiko
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#18

Re: Stringgrid "schnell" beladen

  Alt 29. Jun 2009, 11:46
Also hab alles ausprobiert ...keine wahrnehmbare Verbesserung...

Tja, muss ich vielleicht doch mal mit nem DBGrid ähnlichen Ansatz aufwarten....wenn es mal ein paar Kunden
mehr betreffen sollte XD .
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
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
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz