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 :
IComparer
TCustomComparer
StrComp
...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