![]() |
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 ![]() 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" ... |
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. |
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! |
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 |
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. |
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? |
Re: TStringgrid sortieren - schlechte + bessere Lösung
Zitat:
Irgendwo war doch heute ein Quiz. Glaube DF ? :gruebel: Hier ist meines : Man sortiere ein Grid. Allerdings soll das so aussehen :
Delphi-Quellcode:
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 :
Nr Name5 Ort1
Name4 Nr Name3 Ort2 Nr Name2 Ort3 Name1
Delphi-Quellcode:
Preisfrage stufe ich im Delphi-Millionärs-Quiz mal bei 50.000 EUR ein. Eventueller Gewinn wird allerdings NICHT ausgezahlt. :wiejetzt: :mrgreen:
Nr Name2 Ort1
Name1 Nr Name3 Ort2 Nr Name5 Ort3 Name4 Zur Verfügung stehen ausser dem Grid selber TStringList, TList oder TObjectList. Edit : Delphi-Code wegen Spalten-Simulation. Kein Quelltext !! |
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? |
Re: TStringgrid sortieren - schlechte + bessere Lösung
War Tippfehler. Neuer Versuch klarzumachen, was das soll :
Delphi-Quellcode:
Jetzt soll absteigend sortiert werden über 3. Spalte. Dass das Grid also danach so aussieht :
1 Meier 1,00
Karl 2 Sakura 3,00 3 Schmitt 2,00 Heinz
Delphi-Quellcode:
Weils so schön ist. :mrgreen: Es soll nun nach Nachname absteigend sortiert werden (Vorname egal, selbst wenn keiner da) :
2 Sakura 3,00
3 Schmitt 2,00 Heinz 1 Meier 1,00 Karl
Delphi-Quellcode:
So geht C+P auch besser. :shock:
3 Schmitt 2,00
Heinz 2 Sakura 3,00 1 Meier 1,00 Karl |
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 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz