Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TStringgrid sortieren - schlechte + bessere Lösung (https://www.delphipraxis.net/119811-tstringgrid-sortieren-schlechte-bessere-loesung.html)

taaktaak 1. Sep 2008 10:54


TStringgrid sortieren - schlechte + bessere Lösung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin, Moin.
Häufig wird hier im Forum das Thema "Sortieren von StringGrids" behandelt. So auch in diesem Thread vor einigen Tagen: Die sehr deutlichen Anmerkungen von "Hansa", haben mich nachdenklich gemacht, denn auch ich verwende bisher die augenscheinlich schlechteste von allen Methoden: Datenhaltung im Stringgrid und sortieren mittels einer Hilfsliste (TStringlist). Bei kleinen Datenmengen von vielleicht 1000 bis 2000 Zeilen meist schnell genug. Aber wenn's mehr werden... Dann dauert so ein Sort tatsächlich viel zu lange.

Nun habe ich am Wochenende mal ein wenig "gebastelt. Ich denke, dass dabei etwas herausgekommen ist, das den Hinweisen von "Hansa" schon recht nahe kommt. Als Anlage eine kleine Demonstration als EXE incl. Source, die 3 verschiede Datenhaltungs-/Sortiermöglichkeiten und deren Geschwindigkeit testen lässt:

Variante 1 - Alle Daten im Stringgrid, Sortierung mit Hilfsliste >> minimaler Speicherverbrauch, längste Sortierdauer (bei vielen Daten inakzeptabel).

Variante 2 - Alle Daten in TList, Sortierung mit Hilfe von TList, alle Daten werden zur Anzeige ins Stringgrid kopiert >> maximaler Speicherverbrauch (x2), deutlich schnelleres Sortieren.

Variante 3 - Alle Daten in TList, Sortierung mit Hilfe von TList, nur die jeweils sichtbaren Daten werden in das Stringgrid kopiert >> kaum mehr Speicherverbrauch als in Variante 1, schnellstes Sortieren.

Wer also noch kein optimiertes Verfahren verwendet, kann sich vielleicht mit Hilfe dieser "Daddelanwendung" überzeugen lassen, die Variante 1 schnell "in die Tonne zu treten" ...

Hansa 1. Sep 2008 11:53

Re: TStringgrid sortieren - schlechte + bessere Lösung
 
Vorab : In dem anderen Thread, da hatte ich weder die Geschwindigkeit noch den Speicherverbrauch im Auge ! Erstrangig ist immer die Programmlogik. Da der im Internet aufgefischte Source-Fetzen auch in dieser Richtung etwas seltsam war, ist es nicht verwunderlich, dass er auch noch langsam ist.

Hinzu kommt der Umstand, dass man die StringGrids sehr schnell um den Faktor 10-100 verlangsamen kann. Dazu braucht man nur visible auf true zu setzen und das Grid dann erst zu füllen. Geschwindigkeitsmessungen sind da besonders vorsichtig zu begutachten. 8)

So, jetzt zu Deinem Testprogramm. Du verwendest TList. Ich hatte eine TObjectList vorgeschlagen, um die Nutzdaten eben in TObjects zu packen und bemängelt, dass sie ansonsten zumindest bei dem Fetzen wieder in String und zurück gewandelt werden müssen. Zumindest Stringumwandlung entfällt bei der TList. Kenne die TList zu wenig, aber eventuell ist die TObjectList sogar noch schneller zu sortieren.

taaktaak 1. Sep 2008 13:17

Re: TStringgrid sortieren - schlechte + bessere Lösung
 
Moin Hansa :hi:
dann werde ich das jetzt auch mal mit TObjectList testen.
Vielen Dank für den Hinweis!

juergen 1. Sep 2008 13:46

Re: TStringgrid sortieren - schlechte + bessere Lösung
 
@ taaktaak,

das Thema interessiert mich und gibt mir auch einige Lernansätze. :thumb:
Leider fehlt in deinem Zip-File anscheinend die Unit "rzC_Grid".
Könntest du diese bitte nachreichen?

Danke und Gruß
Jürgen

taaktaak 1. Sep 2008 14:10

Re: TStringgrid sortieren - schlechte + bessere Lösung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo juergen!
Hatte mit voller Absicht von rzC_Grid nur die .dcu beigefügt: Das war vor einigen Jahren mein allererster Versuch, eine Komponente abzuleiten und das Stringgrid um zusätzliche Funktionaliäten zu erweitern. Entsprechend meiner damaligen Fähigkeiten ist (aus heutiger Sicht) grauenhafter Code entstanden.
Also bitte nur anschauen, wenn du sehen möchtest, wie man es nicht macht! Auch lohnt eine Optimierung des Codes nicht; mit den in den letzten Tagen gesammelten Erkenntnissen werde ich das komplett neu aufsetzen.

taaktaak 1. Sep 2008 16:02

Re: TStringgrid sortieren - schlechte + bessere Lösung
 
So, hab's mit TObjectList ausgetestet und keine signifikanten Geschwindigkeitsunterschiede feststellen können. TList ist ja wohl der direkte Vorfahr von TObjectList; als einzigen Unterschied kann ich derzeit feststellen, dass TObjectList die Objekte selbst entfernt. Das muss man bei TList selbst erledigen, ist natürlich kein nennenswerter Aufwand.

Irritiert bin ich aber über die stark differierenden Sortierzeiten: Lasse ich eine Spalte mehrfach abwechselnd auf-/absteigend sortieren, unterscheidet sich der Zeitbedarf (manchmal) bis etwa Faktor 1,5.

Liegt das am Speichermanager?
Kann man dagegen etwas tun?

Hansa 1. Sep 2008 18:31

Re: TStringgrid sortieren - schlechte + bessere Lösung
 
Zitat:

Zitat von taaktaak
...als einzigen Unterschied kann ich derzeit feststellen, dass TObjectList die Objekte selbst entfernt. Das muss man bei TList selbst erledigen, ...

Und das ist nichts ? :shock: Aber Hallo, eine wichtige Fehlerquelle weniger. Es gibt ja auch praktische Gründe, ein StringGrid nicht über eine Stringliste zu sortieren.

Irgendwo war doch heute ein Quiz. Glaube DF ? :gruebel: Hier ist meines :

Man sortiere ein Grid. Allerdings soll das so aussehen :

Delphi-Quellcode:
Nr Name5 Ort1
    Name4 
Nr Name3 Ort2
Nr Name2 Ort3
    Name1
Das soll nun nach Name sortiert werden, aber nur nach Zeilen in denen "Nr" vorhanden ist. D.h. sofern 2 Namenszeilen vorhanden sind, dann sollen die auch zusammenbleiben. Im Endeffekt soll es bei Sortierung über Name so aussehen :

Delphi-Quellcode:
Nr Name2 Ort1
    Name1 
Nr Name3 Ort2
Nr Name5 Ort3
    Name4
Preisfrage stufe ich im Delphi-Millionärs-Quiz mal bei 50.000 EUR ein. Eventueller Gewinn wird allerdings NICHT ausgezahlt. :wiejetzt: :mrgreen:

Zur Verfügung stehen ausser dem Grid selber TStringList, TList oder TObjectList.

Edit : Delphi-Code wegen Spalten-Simulation. Kein Quelltext !!

taaktaak 1. Sep 2008 20:03

Re: TStringgrid sortieren - schlechte + bessere Lösung
 
Moin Hansa.

Hört sich interessant an, warum nicht mal ein Quiz?
Allerdings irritiert mich die Aufgabenstellung ein wenig :(

a) Wenn das Grid in einer Zeile quasi einen Record enthält, gehören die einzelnen Felder zusammen. Insofern kann ich nicht nachvollziehen, dass in der Ergebnistabelle neue Records gebildet werden. Oder: Wenn in der Ausgangstabelle Name5 mit Ort1 verknüpft ist, wie können dann im Ergebnis Name5 und Ort3 zusammenkommen? Ist das ein Tippfehler?

b) Wenn nur Einträge die eine Nr enthalten sortiert werden sollen, müssten Name4 und Name1 ihre Tabellenpositionen behalten. Die sind in deiner Ergebnistabelle aber auch sortiert?

Wenn wir das geklärt haben, wäre das einen witzige Aufgabe für das nächste Wochenende
:hi:

PS : Keiner 'ne Idee zu den sehr unterschiedlichen Sortierzeiten?

Hansa 2. Sep 2008 10:32

Re: TStringgrid sortieren - schlechte + bessere Lösung
 
War Tippfehler. Neuer Versuch klarzumachen, was das soll :

Delphi-Quellcode:
1  Meier    1,00
   Karl
2  Sakura   3,00
3  Schmitt  2,00 
   Heinz
Jetzt soll absteigend sortiert werden über 3. Spalte. Dass das Grid also danach so aussieht :

Delphi-Quellcode:
2  Sakura   3,00
3  Schmitt  2,00 
   Heinz
1  Meier    1,00
   Karl
Weils so schön ist. :mrgreen: Es soll nun nach Nachname absteigend sortiert werden (Vorname egal, selbst wenn keiner da) :

Delphi-Quellcode:
3  Schmitt  2,00 
   Heinz
2  Sakura   3,00
1  Meier    1,00
   Karl
So geht C+P auch besser. :shock:

mkinzler 2. Sep 2008 10:37

Re: TStringgrid sortieren - schlechte + bessere Lösung
 
Es ist die Frage, ob da ein StringGrid geeignet ist


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 Uhr.
Seite 1 von 4  1 23     Letzte »    

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