AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

StringGrid sortieren

Ein Thema von yankee · begonnen am 4. Mai 2007 · letzter Beitrag vom 31. Jul 2011
Antwort Antwort
Seite 2 von 2     12
NetSonic

Registriert seit: 10. Mai 2007
124 Beiträge
 
Delphi 10 Seattle Professional
 
#11

Re: StringGrid sortieren

  Alt 5. Nov 2008, 14:36
Mehr sind es ja auch nicht - höchstens 200 Zeilen und dafür würde es doch reichen!? Aber mir fehlt halt nur der Ansatz, wie ich jetzt die Daten sortieren kann...
  Mit Zitat antworten Zitat
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#12

Re: StringGrid sortieren

  Alt 5. Nov 2008, 16:30
Hier ien kleiner denkanstoß, es muß0 nciht das im grind drinsttehen weas er anzeugt, zauberwort ist oncelldraw.
Ich habe bei einer älteren anwendung zum beispiel das datum in ein unix timestamp verwandelt und in das grid geschrieben.. und angezeigt wird dann das datum. so läßt es sich leichter sortieren.

Aber wie oben bereits erwähnt.. es ist nicht "die schnellste methode so zu sortieren"
  Mit Zitat antworten Zitat
NetSonic

Registriert seit: 10. Mai 2007
124 Beiträge
 
Delphi 10 Seattle Professional
 
#13

Re: StringGrid sortieren

  Alt 5. Nov 2008, 16:46
Ah *klingelling* - ich glaube damit bringst Du mich auf die richtige Idee... Mal sehen, werde Deinen Ansatz mal verfolgen! Danke.

NetSonic
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#14

Re: StringGrid sortieren

  Alt 6. Nov 2008, 19:45
Zitat von NetSonic:
Allerdings enthalten die zu sortieren Spalten ein Datum als String im Format TT.MM.JJJJ und dies möchte ich korrekt sortieren.
Ja, mit dieser CompareStringGridRows-Funktion:
Delphi-Quellcode:
var col,dir: integer;

function CompareStringGridRows(item1,item2: Pointer):integer;
var s1,s2: string;
    n1,n2: integer;
begin
  s1 :=@TStrings(item1).Strings[col];
  s2 :=@TStrings(item2).Strings[col];

// Jahr
  n1 :=strtoint(substr(s1, -4, 4));
  n2 :=strtoint(substr(s2, -4, 4));
  
  if n1 < n2 then
  begin
    result :=dir;
    exit;
  else if n1 > n2 then
  begin
    result :=dir*-1;
    exit;
  end;

//Monat:

  n1 :=strtoint(substr(s1, 4, 2));
  n2 :=strtoint(substr(s2, 4, 2));

  if n1 < n2 then
  begin
    result :=dir;
    exit;
  else if n1 > n2 then
  begin
    result :=dir*-1;
    exit;
  end;

//Tag:

  n1 :=strtoint(substr(s1, 0, 2));
  n2 :=strtoint(substr(s2, 0, 2));

  if n1 < n2 then
  begin
    result :=dir;
    exit;
  else if n1 > n2 then
  begin
    result :=dir*-1;
    exit;
  end;
  result :=0;
end;
ungetestet und alles. Die Funkion substr gibt es in Delphi glaube ich nicht. D musst du glaube ich copy nehmen. Ich denke, du kannst dir denken, wie das gedacht ist...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
KFAF

Registriert seit: 5. Mai 2011
12 Beiträge
 
Delphi XE3 Professional
 
#15

AW: StringGrid sortieren

  Alt 31. Jul 2011, 21:46
Hallo Leute,

ich kram ja eigentlich nie was wieder aus, aber falls jemand mal darauf stößt :

Seit neuem wird ja in Delphi auch mit Template-Klassen gearbeitet, und jeder der
eine größere Liste von Daten hat, benutzt bestimmt auch TList<TYPE> aus den Generics.Collections. Wer die gerne sein StringGrid sortieren will, sollte wie schon bereits gesagt, doch seine Daten im Ursprung in einer solchen Liste womöglich aus Records halten und dort drin sortieren.

Dies realisiert man mit einem TCustomComparer<TYPE> oder einer anderen Klasse vom Interface IComparer<TYPE>, sozusagen einer Klasse mit der function COMPARE(Left, Right : TYPE), die zwei Datensätze von eurem Listendatentyp vergleicht.

Wollt ihr also eine Liste aus Records wie z.B.

Delphi-Quellcode:
TTestRec = record
  sName : string;
  sDescr : string;
  dtTimestamp : TDateTime;
end;
sortieren, müsste eurer TTestRecComparer so aussehen :

Delphi-Quellcode:
TTestRecComparer = class(TCustomComparer<TTestRec>)
  ...
  function Compare(Left, Right : TTestRec) : integer;
  ...
end;
in Compare muss dan bloß Links mit rechts verglichen werden, wobei 0 gleich, etwas negativs links "größer", etwas positives rechts "größer" bedeutet.

So würdet ihr aufsteigend sortieren, wollt ihr es jedoch absteigend, so müsste dem Comparer noch eine Info übergeben werden und dann braucht ihr bloß das normale Vergleichsergebniss invertieren, etwa so :

Delphi-Quellcode:
if soSortOrder = soDescending then
  result := -result;
Wenn man nun seinen eigenen Comparer nutzen will, übergibt man einfach :

Delphi-Quellcode:
  lcMyComparer := TTestRecComparer.Create(soASCENDING);
  MyList.Sort(lcMyComparer);
Ich hoffe das hilft euch beim Listen sortieren weiter, die ihr dann z.B. ins StringGrid übertragen wollt.

PS :
Delphi-Referenz durchsuchenIComparer
Delphi-Referenz durchsuchenTCustomComparer
Delphi-Referenz durchsuchenStrComp

...könnten euch z.B. helfen

EDIT :
DateTime Werte sind ja Fließkommawerte und lassen sich also mit > , = und < vergleichen.

Mit freundlichen Grüßen
KFAF SP
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:38 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