AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TStringgrid sortieren - schlechte + bessere Lösung
Thema durchsuchen
Ansicht
Themen-Optionen

TStringgrid sortieren - schlechte + bessere Lösung

Ein Thema von taaktaak · begonnen am 1. Sep 2008 · letzter Beitrag vom 4. Sep 2008
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#1

TStringgrid sortieren - schlechte + bessere Lösung

  Alt 1. Sep 2008, 10:54
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" ...
Angehängte Dateien
Dateityp: zip gridsorts_118.zip (283,9 KB, 42x aufgerufen)
Ralph
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: TStringgrid sortieren - schlechte + bessere Lösung

  Alt 1. Sep 2008, 11:53
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#3

Re: TStringgrid sortieren - schlechte + bessere Lösung

  Alt 1. Sep 2008, 13:17
Moin Hansa
dann werde ich das jetzt auch mal mit TObjectList testen.
Vielen Dank für den Hinweis!
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: TStringgrid sortieren - schlechte + bessere Lösung

  Alt 1. Sep 2008, 13:46
@ taaktaak,

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

Danke und Gruß
Jürgen
Jürgen
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#5

Re: TStringgrid sortieren - schlechte + bessere Lösung

  Alt 1. Sep 2008, 14:10
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.
Angehängte Dateien
Dateityp: zip rzc_grid_189.zip (8,6 KB, 16x aufgerufen)
Ralph
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#6

Re: TStringgrid sortieren - schlechte + bessere Lösung

  Alt 1. Sep 2008, 16:02
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?
Ralph
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: TStringgrid sortieren - schlechte + bessere Lösung

  Alt 1. Sep 2008, 18:31
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 ? 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 ? 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.

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

Edit : Delphi-Code wegen Spalten-Simulation. Kein Quelltext !!
Gruß
Hansa
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#8

Re: TStringgrid sortieren - schlechte + bessere Lösung

  Alt 1. Sep 2008, 20:03
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


PS : Keiner 'ne Idee zu den sehr unterschiedlichen Sortierzeiten?
Ralph
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

Re: TStringgrid sortieren - schlechte + bessere Lösung

  Alt 2. Sep 2008, 10:32
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. 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: TStringgrid sortieren - schlechte + bessere Lösung

  Alt 2. Sep 2008, 10:37
Es ist die Frage, ob da ein StringGrid geeignet ist
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 04:50 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