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:
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...
Weiß irgendjemand Rat?!
Viele Grüße,
das Miri