Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - ListView nach Datum sortieren


Chatfix - Do 03.06.04 12:38
Titel: ListView nach Datum sortieren
Moin,

ich habe ein ListView und in der ersten Spalte (also Item.Caption) steht immer ein Datum im Format tt.mm.jjjj
Ich wollte nun das alle Items nach dem Datum sortiert werden hab aber keine Ahnung wie ich das anstellen könnte.
Vielleicht hat ja jemand sowas schonmal gemacht?!

Danke schonmal im vorraus!


Delete - Do 03.06.04 12:45
Titel: Re: ListView nach Datum sortieren
Wirklich immer
Chatfix hat folgendes geschrieben:
im Format tt.mm.jjjj

? Dann reicht IMHO ein simpler Stringvergleich.


Chatfix - Do 03.06.04 12:59

also bei mir würde er dann so sortieren:

01.05.2004
30.04.2004

anstatt

30.04.2004
01.05.2004

wahrscheinlich wird das format aber auf tt.mm. gekürzt, aber das problem ist das selbe


Delete - Do 03.06.04 13:31

Oh ja, stimmt. :oops:
Zitat:
01.05.2004
30.04.2004

Also, eine einfache Möglichkeit fällt mir im Augenblick nicht ein. Umständlich wäre es wahrscheinlich, die Daten (Datumse ;)) mit "EncodeDate" umzuwandeln und dann als Zahlen zu vergleichen? Oder?


ErnestoChe - Do 03.06.04 13:49

Hallo,

voilà:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.ListView1ColumnClick(Sender: TObject;
  Column: TListColumn);

  function DateSortProc(Item1, Item2: TListItem;
    ParamSort: Integer): Integer; stdcall;
  begin
      // Datum absteigend sortieren, falls aufsteigend erwünscht
      // minus-Zeichen weglassen
    Result := -CompareDate(StrToDate(Item1.Caption),
      StrToDate(Item2.Caption));
  end;

begin
   case Column.Index of
     0: ListView1.CustomSort(@DateSortProc, 0);
   end;
end;


MFG

- Ernesto -


Bronstein - Fr 13.10.06 16:14
Titel: in das On Compare ereignis einfügen
Wie kann ich diesen sortier Algorithmus in das OnCompare-Ereignis des Listviews einbauen. Bekomme es einfach nicht hin.

So funltioniert es nicht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TfrmPMJ.ListView2Compare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
var
  ix: Integer;
begin
    CompareDate(StrToDate(FormatDateTime('dd.mm.yyyy', StrToDateTime(Item1.Caption))),
      StrToDate(FormatDateTime('dd.mm.yyyy', StrToDateTime(Item2.Caption))));
end;


Reinhard Kern - Sa 14.10.06 13:16
Titel: Re: in das On Compare ereignis einfügen
user profile iconBronstein hat folgendes geschrieben:
Wie kann ich diesen sortier Algorithmus in das OnCompare-Ereignis des Listviews einbauen. Bekomme es einfach nicht hin.

So funltioniert es nicht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TfrmPMJ.ListView2Compare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
var
  ix: Integer;
begin
    CompareDate(StrToDate(FormatDateTime('dd.mm.yyyy', StrToDateTime(Item1.Caption))),
      StrToDate(FormatDateTime('dd.mm.yyyy', StrToDateTime(Item2.Caption))));
end;


Hallo,

erstens must du ja was tun, um etwas zu bewirken, in dem Fall must du die Variable Compare verändern. Da das Ergebnis von CompareDate passt, also Compare := CompareDate (...

zweitens, was soll der doppelte Aufruf von StrToDate und StrToDateTime? Beide arbeiten nach dem gleichen Grundsatz, mit der Umformatierung wird also nichts bewirkt, soweit ich sehen kann.

Gruss Reinhard


Bronstein - Di 17.10.06 14:28

Habe noch mal eine Frage.

Wie kann ich nach zwei Spalten sortieren. Nach der Ersten (Caption) und der Dritten. Bei der ersten handelt es sich um ein Datum bei der dritten um Text.

Nach jeweils einer Spalte habe ich es hinbekommen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TfrmVDC.ListView2Compare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
begin
//nach Datum (1.Spalte)
Compare := CompareDateTime(StrToDateTime(Item1.Caption), StrToDateTime(Item2.Caption));

//nach der 3 Spalte
Compare := CompareText(Item1.SubItems[1], Item2.SubItems[1]);
end;


Wie bekomme ich es aber hin, dass er zuerst nach der ersten Spalte sortiert und als zweites Kriterium die dritte Spalte sortiert


Delete - Di 17.10.06 14:48

Aus dem Bauch raus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TfrmVDC.ListView2Compare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
begin
  //nach Datum (1.Spalte)
  Compare := CompareDateTime(StrToDateTime(Item1.Caption), StrToDateTime(Item2.Caption));
  if Compare = 0 then
  //nach der 3 Spalte
    Compare := CompareText(Item1.SubItems[1], Item2.SubItems[1]);
end;

Oder so ähnlich. ;)