AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Sortierfunktion nach Datum in einer TStringList
Thema durchsuchen
Ansicht
Themen-Optionen

Sortierfunktion nach Datum in einer TStringList

Ein Thema von juergen · begonnen am 3. Jul 2015 · letzter Beitrag vom 4. Jul 2015
Antwort Antwort
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

AW: Sortierfunktion nach Datum in einer TStringList

  Alt 4. Jul 2015, 12:40
Wie DeddyH würde ich auch raten, keine 2 Stringlisten zu benutzen. Die irgendwie zu synchronisieren ist echt zu fehlerträchtig, weil dann zwie Datenquellen vorhanden sind. Vor allem ist das aber auch unnötig. Deddy hat sa vielleicht zu knapp beschrieben.

Ich denke er meint (ungefähr zumindest) das, was ich jetzt etwas ausführlicher schreibe. Der Vorteil einer TObjectList ist ja der, dass man in die einzelnen Objekte dieser Liste so ziemlich alle Datentypen die es gibt, reinpacken kann. Definiere dir also einen Typ, der zumindest alles enthält, was angezeigt werden soll. Da geht natürlich auch noch mehr. Diese TObjectList füllst du dann mit deinen Daten.

Jetzt kommt das Stringgrid. Dieses wird gefüllt aus der TObjectList. Soll dieses jetzt sortiert werden, dann sortierst du die TObjectList, machst das Stringgrid leer und befüllst es wieder aus der sortierten TObjectList. Das wars dann. Wegen der TObjectList : das ist zwar Allzweckwaffe, aber man muss diese auch richtig benutzen. Beim Delphi-Treff gibts ein gutes Tutorial dazu.
Gruß
Hansa
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

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
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.176 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Sortierfunktion nach Datum in einer TStringList

  Alt 4. Jul 2015, 16:28
Erst einmal vielen Dank für Eure Mühe!
Sir Rufo's Ansatz ist bestimmt elegant, übersteigt aber meine hobbymäßig eingesetzten Fähigkeiten.

@Popov,
so ähnlich habe ich das auch bei mir schon umgesetzt.
Ich habe eine Listbox im virtuellem Modus, welche nur der Anzeige der Dateinamen dient. Im Hintergrund ist eine StringList mit weiteren Daten und im Object der StringList das Datum als File-Datetime (Integer), welches sich auch "richtig" sortieren lässt und auch sehr schnell ist.


Ich bin nun motiviert, dass Projekt neu aufzusetzen
, nicht mehr unter D2007, sondern mit Delphi XE. Wichtig ist mir, dass ich nun auf das "richtige Pferd" setze.
Ich denke es ist sinnvoll hierfür einen neuen Thread aufzumachen: http://www.delphipraxis.net/1307661-post1.html
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:28 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