Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#10

AW: Sortierfunktion nach Datum in einer TStringList

  Alt 4. Jul 2015, 13:35
@juergen

Also die Idee von DeddyH ist wohl die Beste. Wenn Objekt bereits belegt ist, dann eine Klasse schreiben die sowohl dieses Objekt enthält wie auch ein Zweites. Letztendlich die einfachste Methode.

Trotzdem, hier mal eine "Trick 17" Methode. Liste (TStringList) enthält 1000 Daten mit Uhrzeiten. Dennoch wird sie korrekt alphabetisch sortiert. Der eigentliche Trick ist, dass die Daten anders gespeichert sind als sie angezeigt werden:

Delphi-Quellcode:
function DateTimeFormatDE: TFormatSettings;
begin
  Result.DateSeparator := '.';
  Result.TimeSeparator := ':';
  Result.ShortDateFormat := 'dd/MM/yyyy hh:nn:ss';
end;

function DateTimeFormatINT: TFormatSettings;
begin
  Result.DateSeparator := '-';
  Result.TimeSeparator := ':';
  Result.ShortDateFormat := 'yyyy/MM/dd hh:nn:ss';
end;

procedure ListeMitZufaelligenDatenGenerieren(List: TStrings; Max: Integer);
var
  i: Integer;
  dt: TDateTime;
begin
  for i := 1 to Max do
  begin
    dt := EncodeDateTime(Random(115) + 1900, Random(12) + 1, Random(28) + 1,
      Random(24), Random(60), Random(60), Random(1000));
    List.Add(DateTimeToStr(dt, DateTimeFormatDE)); //erstelle deutsch-typsch
  end;
end;

procedure DatenInListeInAnderesFormatAendern(List: TStrings);
var
  i: Integer;
  dt: TDateTime;
begin
  for i := 0 to List.Count - 1 do
  begin
    dt := StrToDateTime(List[i], DateTimeFormatDE); //lese deutsch-typsch
    List[i] := DateTimeToStr(dt, DateTimeFormatINT); //verändere international
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Datum deutsch-typisch 27.03.2015 14:58:36. Für Sortierung ungeeigent
  ListeMitZufaelligenDatenGenerieren(ListBox1.Items, 1000);

  //Datum untypisch 2015-03-27 14:58:36. Für Sortierung geeignet
  DatenInListeInAnderesFormatAendern(ListBox1.Items);

  ListBox1.Sorted := True;

  ListBox1.Style := lbOwnerDrawFixed;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  Delta: Integer;
  dt: TDateTime;
  s: String;
begin
  with (Control as TListbox) do
  begin
    //Das Datum ist in der StringList untypisch gespeichert: 2015-03-27 14:58:36
    //Hier wird es für die typische Darstellung 27.03.2015 14:58:36 verändert.

    dt := StrToDateTime(Items[Index], DateTimeFormatINT); //lese international
    s := DateTimeToStr(dt, DateTimeFormatDE); //erstelle deutsch-typsch

    Delta := (ItemHeight div 2) - (Canvas.TextHeight(Items[Index]) div 2);
    Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + Delta, s);
  end;
end;
  Mit Zitat antworten Zitat