![]() |
Listview nach Datum sortieren
Moin Moin,
ich habe mir eine kleine Prozedur zusammengebastelt um eine Listview nach dem Datum im Caption zu sortieren. Das funktioniert soweit auch gut, nur sieht der Code ziemlich bescheiden (Nett ausgedrückt). Daher wollte ich mal Fragen wie man es besser machen kann.
Delphi-Quellcode:
Wenn man die Prozedur SortByDate ausführt wird die die Listview durchlaufen
function FindLow (Da:TDate): boolean;
var i : integer; NewDa : Tdate; begin result := false; NewDa := Da; for I := 0 to frmMain.lv1.Items.Count -1 do if (strtodate(frmMain.lv1.Items[i].Caption) < Da) then NewDa := strtodate(frmMain.lv1.Items[i].Caption); if Da = NewDa then result := true; end; Procedure SortbyDate; var i: integer; aItem : TListItem; begin frmMain.listview1.Clear; repeat for i:= frmMain.lv1.Items.Count -1 downto 0 do if FindLow(strtodate(frmMain.lv1.Items[i].Caption))=true then begin aItem := frmMain.Listview1.Items.Add; aItem.Caption := frmMain.lv1.Items[i].Caption; aItem.SubItems.Add(frmMain.lv1.Items[i].SubItems[0]); frmMain.lv1.Items[i].Delete; end; until frmMain.lv1.Items.Count = 0; end; und das Ergebnis dann sortiert in einer zweiten Listview ausgegeben. Danke für die Hilfe |
AW: Listview nach Datum sortieren
Beispiel mit Spalte 0 = Datum im gültigen Format, der Rest normale Zeichenketten.
Das geht sicher noch schöner. Ist jetzt einfach nur aus einer existierenden Unit rauskopiert und unnötiges Zeug wurde gelöscht. Ist also nicht auf Funktionalität getestet.
Delphi-Quellcode:
procedure TForm1.ListViewColumnClick(Sender: TObject; Column: TListColumn);
begin ListViewColumnToSort := Column.Index; end; procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); var TextToSort1, TextToSort2: string; begin if ListViewColumnToSort = 0 then begin TextToSort1 := Item1.Caption; TextToSort2 := Item2.Caption; end else begin TextToSort1 := Item1.SubItems[ListViewColumnToSort - 1]; TextToSort2 := Item2.SubItems[ListViewColumnToSort - 1]; end; case (Sender as TListView).Columns[ListViewColumnToSort].Tag of 0: // DateTime begin Compare := 0; if StrToDateTime(TextToSort1) > StrToDateTime(TextToSort2) then Compare := Trunc(StrToDateTime(TextToSort1) - StrToDateTime(TextToSort2)) + 1 else if StrToDateTime(TextToSort1) < StrToDateTime(TextToSort2) then Compare := Trunc(StrToDateTime(TextToSort1) - StrToDateTime(TextToSort2)) - 1; end; else // Strings Compare := AnsiCompareText(TextToSort1, TextToSort2); end; end; |
AW: Listview nach Datum sortieren
So eine Methode wie LTE5 habe ich auch. Bei ListViewColumnClick fehlt übrigens noch der Befehl AlphaSort hinter der Zuweisung.
Ich speichere allerdings immer noch in einer nicht sichtbaren SubItems-Spalte das Roh-Datum als Zahl, entweder als Unixtime (=Int64) oder TDateTime (=Double). Das liegt daran, dass ich auf Datenebene immer mit UTC arbeite und das dann in lokale Zeit umwandle. So kann das Programm beim Sorten die Umstellung auf Winterzeit 2A:59 Uhr auf 2B:00 Uhr unterschieden und richtig sortieren. |
AW: Listview nach Datum sortieren
Zitat:
|
AW: Listview nach Datum sortieren
Sorgt dafür, dass beim Klick auf eine Spalte überhaupt was passiert. Sonst passiert da ja nichts.
|
AW: Listview nach Datum sortieren
Um so ein Datum ohne vielfaches Konvertieren direkt im ListItem zu speichern bietet sich folgendes an (das spart nicht nur das Konvertieren, sondern überlebt auch ein mögliches Verschieben von Spalten in Zukunft):
Oder gleich OwnerData :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz