Miri - Di 19.09.06 17:01
Titel: nach Datum sortieren klappt nicht ganz...
Hi Jungs, mal wieder ein Problem :-)
vielleicht hab ich einfach Tomaten aufn Augen, aber ich find den Fehler nicht...
Ich hab in nem VST drei Spalten und will durch Klick auf den Header das ganze je nach Spalte sortieren. So weit, so gut.
Also, die erste Spalte sind Strings (Dateinamen), die übrigen sind Datums-Felder (Erstell- und Änderungsdatum).
Beim ersten mal auf die Spalte klicken soll aufsteigend, beim zweiten mal klicken absteigend sortiert werden. Klappt bei den Strings auch soweit.
Jetzt möchte ich aber, wenn ich gerade eine Spalte aufsteigend sortiert hab, und dann auf eine andere Spalte klicke, dass die auch aufsteigend sortiert wird (daher die Variable "letzteSortierteSpalte").
Witziger weise klappt das auch in den meisten Fällen...
AAAber, wenn ich die Strings absteigend sortiert hab, und dann auf eines der Datums-Felder klicke (wonach ja dann wieder aufsteigend sortiert werden soll), sind die ersten beiden Nodes falsch rum. Der Rest passt dann...
Sieht dann also so aus:
10.01.2006
09.01.2006
13.02.2006
...
Hier meine CompareNodes und die HeaderClick Procedure:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| procedure TfrmMain.vstFilesCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); var Data1: PFileInfos; Data2: PFileInfos; begin Data1:=vstFiles.GetNodeData(Node1); Data2:=vstFiles.GetNodeData(Node2);
if (not Assigned(Data1)) or (not Assigned(Data2)) then Result:=0 else begin if Column = 1 then begin Result:=CompareText(Data1.FName, Data2.FName); end else if Column = 2 then begin result := Trunc(StrToDateTime(Data1.FEDatum) - StrToDateTime(Data2.FEDatum)); end else if Column = 3 then begin result := Trunc(StrToDateTime(Data1.FADatum)-StrToDateTime(Data2.FADatum)); end; letzteSortierSpalte := Column; end; end;
procedure TfrmMain.vstFilesHeaderClick(Sender: TVTHeader; Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if letzteSortierSpalte <> Column then begin Sender.SortDirection := sdAscending; end; Application.ProcessMessages; vstFiles.SortTree(Column,Sender.SortDirection,True); if Sender.SortDirection=sdAscending then Sender.SortDirection:=sdDescending else Sender.SortDirection:=sdAscending end; |
Gerade ist mir noch aufgefallen, dass das nur beim Desktop so ist, bei anderen Ordnern funktioniert das einwandfrei... :gruebel:
Weiß irgendjemand Rat?!
Viele Grüße,
das Miri
wulfskin - Di 19.09.06 17:24
Hallo,
ich hatte noch nie Probleme mit dem sortieren. Sieht auch soweit ganz gut aus. Ich versteh allerdings nicht, warum du die Daten nicht gleich als TDateTime ablegst und die dann direkt vergleichst.
Außerdem geht es auch ohne globale Variable:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if Button = mbLeft then begin if Sender.SortColumn = Column then begin if Sender.SortDirection = sdAscending then Sender.SortDirection := sdDescending else Sender.SortDirection := sdAscending; end else Sender.SortDirection := sdAscending; Sender.TreeView.SortTree(Column, Sender.SortDirection); Sender.SortColumn := Column; end; |
Liegt wohl an der Einlesefunktion vom Datum, ansonsten sieht es wie gesagt gut aus.
Gruß Hape!
Miri - Do 21.09.06 19:25
wulfskin hat folgendes geschrieben: |
| Ich versteh allerdings nicht, warum du die Daten nicht gleich als TDateTime ablegst und die dann direkt vergleichst. |
Reines Nicht-Mitdenken meinerseits! ;-) Hab ich jetzt geändert.
wulfskin hat folgendes geschrieben: |
| Liegt wohl an der Einlesefunktion vom Datum, ansonsten sieht es wie gesagt gut aus. |
Hmm, ich würd sagen, es lag an einer Kombination aus der Einlesefunktion und dem Trunc, denn nur das Datumsformat behalten reichte irgendwie nicht...
Aber so gehts jetzt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| if data1.FEDatum < data2.FEDatum then result := -1 else if data1.FEDatum = data2.FEDatum then result := 0 else result := 1; |
Danke nochmal :-)