@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;