Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TList und Datumsortieren


Jakane - Di 17.05.11 09:21
Titel: TList und Datumsortieren
Ich habe eine Liste mit Datumsangaben.
Ich habe zwar jedes Datum wie gewünscht nur einmal, aber er sortiert mir Datum wie ein String und nicht wie ein Date :cry:
Aber eine Auswahl die von 01.01.09 auf 01.01.10 springt statt auf 02.01.09 ist blödsinn :(


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  lbSortierliste.Items.Clear;
  For i:= 0 to cbMischen.Items.Count - 1 do  //unterschiedliche Datumsangaben
  Begin
    Sx:= cbMischen.Items.Strings[i];
    if Trim(Sx) <> '' then lbSortierliste.Items.Add(Sx);
  end;
  _DuplicateClear.Click;
  lbDatum.Items.AddStrings(lbSortierliste.Items);
  lbDatum.ItemIndex:= 0;
  txtDatum.Text:= lbDatum.Items.Strings[0];


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TfmFehlerteufel._DuplicateClearClick(Sender: TObject);
var
  Sortierliste : TStringList;
begin
  Sortierliste:= TStringList.Create;
  Sortierliste.Sorted:= True;
  Sortierliste.Duplicates:= DupIgnore;
  Sortierliste.AddStrings(lbSortierliste.Items);
  lbSortierliste.Items.Clear;
  lbSortierliste.Items.AddStrings(Sortierliste);
  Sortierliste.Free;
end;


Weiss jemand Rat?

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 17.05.2011 um 12:27


Horst_H - Di 17.05.11 10:24

Hallo,

etwas in der Richtung?
http://www.swissdelphicenter.ch/en/showcode.php?id=1664
Kleiner Hinweis. customsort muss immer selbst aufgerufen werden.
Sorted auf true liefert dir nur Dein bisheriges Ergebnis.

Gruß Horst


Jakane - Di 17.05.11 12:34

user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

Kleiner Hinweis. customsort muss immer selbst aufgerufen werden.
Sorted auf true liefert dir nur Dein bisheriges Ergebnis.

Gruß Horst


versteh ich nicht, ist da was falsch?

Und der Link ist zwar richtig... aber wie ich das bei mir einbauen soll versteh ich nicht :(


Horst_H - Di 17.05.11 12:53

Hallo,

in etwa so:


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:
function CompareDates(List: TStringList; Index1, Index2: Integer): Integer;
var
  d1, d2: TDateTime;
begin
  d1 := StrToDate(List[Index1]);
  d2 := StrToDate(List[Index2]);
  if d1 < d2 then
    Result := -1
  else if d1 > d2 then Result := 1
  else
    Result := 0;
end;

procedure TfmFehlerteufel._DuplicateClearClick(Sender: TObject);
var
  Sortierliste : TStringList;
begin
  Sortierliste:= TStringList.Create;
  // sortiert sollten Dupletten schneller zu finden und entfernen sein
  Sortierliste.Sorted:= True; 
  Sortierliste.Duplicates:= DupIgnore;
  Sortierliste.AddStrings(lbSortierliste.Items);
  // ICh weisz jetzt nicht, sorted= true nicht Customsort direkt wieder zunichte macht
  Sortierliste.Sorted:= false;
  Sortierliste.CustomSort(CompareDates);
 
  lbSortierliste.Items.Clear;
  lbSortierliste.Items.AddStrings(Sortierliste);
  Sortierliste.Free;
end;


Gruß Horst


Jakane - Mi 18.05.11 11:17

Danke :)