Re: StringGrid sortieren
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...
|
Re: StringGrid sortieren
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" |
Re: StringGrid sortieren
Ah *klingelling* - ich glaube damit bringst Du mich auf die richtige Idee... :idea: Mal sehen, werde Deinen Ansatz mal verfolgen! Danke.
NetSonic |
Re: StringGrid sortieren
Zitat:
Delphi-Quellcode:
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...
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; |
AW: StringGrid sortieren
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:
sortieren, müsste eurer TTestRecComparer so aussehen :
TTestRec = record
sName : string; sDescr : string; dtTimestamp : TDateTime; end;
Delphi-Quellcode:
in Compare muss dan bloß Links mit rechts verglichen werden, wobei 0 gleich, etwas negativs links "größer", etwas positives rechts "größer" bedeutet.
TTestRecComparer = class(TCustomComparer<TTestRec>)
... function Compare(Left, Right : TTestRec) : integer; ... end; 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:
Wenn man nun seinen eigenen Comparer nutzen will, übergibt man einfach :
if soSortOrder = soDescending then
result := -result;
Delphi-Quellcode:
Ich hoffe das hilft euch beim Listen sortieren weiter, die ihr dann z.B. ins StringGrid übertragen wollt.
lcMyComparer := TTestRecComparer.Create(soASCENDING);
MyList.Sort(lcMyComparer); 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 :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 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