Autor Beitrag
Miri
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Di 19.09.06 18:01 
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:

ausblenden volle Höhe 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

_________________
Anonymes Eckenkind
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Di 19.09.06 18: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:
ausblenden 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!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Miri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Do 21.09.06 20:25 
user profile iconwulfskin 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.
user profile iconwulfskin 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:
ausblenden 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 :-)

_________________
Anonymes Eckenkind