AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listbox nach Datum sortieren

Ein Thema von Codix32 · begonnen am 29. Mai 2009 · letzter Beitrag vom 4. Jul 2009
Antwort Antwort
Seite 3 von 5     123 45      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#21

Re: Listbox nach Datum sortieren

  Alt 24. Jun 2009, 15:16
@ 0xF30FC7: Ich fühle mich verfolgt. Bist du das, der in dem schwarzen Lieferwagen bei mir vor dem Haus mit seinem Laptop hockt?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#22

Re: Listbox nach Datum sortieren

  Alt 24. Jun 2009, 15:20
Als ob ich meinen heimischen Keller je verlassen würde!
Fridolin Walther
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#23

Re: Listbox nach Datum sortieren

  Alt 24. Jun 2009, 16:55
@Codix32

Ich hab hier noch einen weiteren Ansatz (Code ist ungeprüft, sollte aber funktionieren):

Delphi-Quellcode:
type
  TData = class
    Datum: TDateTime;
    DatumStr: String;
  end;

procedure LBItemHinzufuegen(LB: TListBox; Datum: TDateTime; Str: String);
var
  Data: TData;
begin
  Data := TData.Create;
  Data.Datum := Datum;
  Data.DatumStr := FormatDateTime('yyyy.mm.dd hh:mm:ss', Datum);
  LB.Items.AddObject(Str, Data);
end;

procedure LBItemLoeschen(LB: TListBox; Index: Integer);
var
  Data: TData;
begin
  Data := TData(LB.Items.Objects[Index]);
  Data.Free;
  LB.Items.Delete(Index);
end;

procedure LBAllesLoeschen(LB: TListBox);
var
  Data: TData;
  i: Integer;
begin
  for i := LB.Items.Count - 1 downto 0 do
  begin
    Data := TData(LB.Items.Objects[i]);
    Data.Free;
    LB.Items.Delete(i);
  end;
end;

procedure LBSortieren(LB: TListBox);
var
  Data: TData;
  i: Integer;
  s: String;
begin
  for i := 0 to LB.Items.Count - 1 do
  begin
    Data := TData(LB.Items.Objects[i]);

    s := Data.DatumStr; // s enthält den String zum sortieren


    // im Data.DatumStr und Data.Datum befinden sich jetzt das Datum als Sting
    // und als Datum. Diese Werte sind unabhängig von dem Text-Inhalt in Items[i],
    // können also eine beliebige Formatierung haben, also auch eine die eine
    // alphabetische Sortierung erleichtet.

    // ... hier die eigene Sortier-Routine
  end;
end;
Der Unterschied hier ist, daß du hier die Daten noch zusätzlich als Objekt an die Items heftest. Bei der Sortierung beachtest du dann die Texte in den Items nicht und sortierst anhand der Daten im Objekt. Der Vorteil ist, da0 du das Datum im Item String so schreiben kannst wie du willst. Warum? Weil es nicht bei der Sortierung beachtet wird.

EDIT:

In Prozedur LBItemLoeschen eine vergessene Zeile hinzugefügt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#24

Re: Listbox nach Datum sortieren

  Alt 24. Jun 2009, 18:19
Das wäre natürlich die beste Lösung. Oder man Mißbraucht die Listbox nicht als Datenablage, sondern benutzt sie nur, um die daten darzustellen. Die Daten werden dann in einer Conteainer-Klasse mit einer Liste gehalten und sortiert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Starstruck

Registriert seit: 6. Apr 2009
Ort: Hessen
21 Beiträge
 
#25

Re: Listbox nach Datum sortieren

  Alt 24. Jun 2009, 18:22
Ich habe in einem Delphi Buch eine Shell Sort Sortier Routine gefunden und auf Luckies Beispiel angepasst. Das Ganze sieht dann so aus:

Delphi-Quellcode:
procedure ShellSort(sl: TStrings);
var
  bis, i, j, k: LongInt;
  h: String;

begin
  bis := sl.Count -1;
  k := bis shr 1;
  while k > 0 do begin
    for i := 0 to bis -k do begin
      j := i;
      while (j >= 0 ) AND (ExtractDateFromString(sl[j]) > ExtractDateFromString(sl[j + k])) do begin
        h := sl[j];
        sl[j] := sl[j + k];
        sl[j + k] := h;
        if j > k then dec(j, k) else j:=0;
      end; // ENDE While (j >= 0 ..
    end; // for i := 0
    k := k shr 1;
  end; // ENDE While
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellSort(Listbox1.Items);
end;
Habs probiert geht um einiges schneller als BubbleSort (< 1 Sec)!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#26

Re: Listbox nach Datum sortieren

  Alt 24. Jun 2009, 18:45
Hallo,

wer Quicksort benutzen will,
nimmt den eingebauten Algorithmus.

CustomSort


Heiko
Heiko
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#27

Re: Listbox nach Datum sortieren

  Alt 28. Jun 2009, 13:11
Uff, soviel Hilfe und Unterstützung...Danke Euch

Ich habe grad Zeit und versuche mal die Listbox mit einer im Forum gefundenen QuickSort Routine zu
sortieren. Die gefundene Routine sortiert aber ein Integer - Array. Mein Versuch eine Stringlist zu sortieren endet erstmal hier:

"...EStringlisterror-Exception...Listenindex überschreitet das Maximum(400)". Liegts am '-1' Item der Listbox?

Also, 400 mit Random erstellte Datums sollen mit Quicksort sortiert werden:

Hier mal meine Quicksort für TStrings:
Delphi-Quellcode:
procedure TForm1.QuickSort(sl:TStrings;LoIndex,HiIndex:Integer);

  procedure QSort(LoIndex, HiIndex: Integer);
  var
    Lo, Hi: Integer;
    Pivot: string;//Integer;
    Swap: string;//Integer;
  begin
    // Wähle stets das mittlere Element als Pivotelement.
    Pivot := sl[(LoIndex + HiIndex) div 2];

    // Stelle die Ordnung bzgl. des Pivotelements her.
    Lo := LoIndex;
    Hi := HiIndex;
    repeat
      while sl[Lo] < Pivot do sl[Lo+1];
      while sl[Hi] > Pivot do sl[Hi-1];
      if sl[Lo] <= sl[Hi] then
      begin
        Swap := sl[Lo];
        sl[Lo] := sl[Hi];
        sl[Hi] := Swap;
        sl[Lo + 1];
        sl[Hi - 1];
      end;
    until sl[Lo] > sl[Hi];

    // Gegebenenfalls linke Teilliste sortieren.
    if LoIndex < Hi then QSort(LoIndex, Hi);

    // Gegebenenfalls rechte Teilliste sortieren.
    if Lo < HiIndex then QSort(Lo, HiIndex);
  end;

begin
  QSort(0, sl.count);
end;



AUFRUF:

procedure TForm1.Button3Click(Sender: TObject);
begin
QuickSort(Listbox3.items,0,Listbox3.count-1);
end;
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#28

Re: Listbox nach Datum sortieren

  Alt 28. Jun 2009, 14:39
Was ist aber mit all den ganzen Beispielen hier? Doch nichts?

Noch ein mal, auch wenn alle hier mit Beispielen kommen wie man ein StringList sortiert, in deinem Fall ist es Quatsch. So kann man Namen sortieren, aber nicht Daten. Natürlich kann man die Schreibweise der Daten dem Problem anpassen, aber das sollte man nicht. Füge der StringList Objekte mit Klar-Daten und sortiere diese anhand dieser Daten. Dann kannst du in dein StringList schreiben was du willst und wie du es willst.

Hier noch mal die komplette Sortierfunktion zu meinem Beispiel oben. Ich hab Luckies Sortierfunktion etwas angepaßt, sortiere aber nach Daten aus den Objekten. Die Strings der Items interessieren mich dabei nicht:

Delphi-Quellcode:
procedure LBSortieren(LB: TListBox);
var
  Data1, Data2, DataTemp: TData;
  Str1, Str2, StrTemp: String;
  i, j: Integer;
begin
  LB.Items.BeginUpdate;

  for i := LB.Items.Count - 1 downto 1 do
  begin
    for j := 1 to i do
    begin
      Data1 := TData(LB.Items.Objects[j-1]);
      Data2 := TData(LB.Items.Objects[j]);

      if Data1.Datum > Data2.Datum then
      begin
        StrTemp := LB.Items[j];
        DataTemp := TData(LB.Items.Objects[j]);

        LB.Items[j] := LB.Items[j-1];
        LB.Items.Objects[j] := LB.Items.Objects[j-1];

        LB.Items[j-1] := StrTemp;
        LB.Items.Objects[j-1] := DataTemp;
      end;
    end;
  end;

  LB.Items.EndUpdate;
end;
Sieht ähnlich aus wie eine normale Sortierung, hier werden aber die Daten aus dem Objekt verglichen.

Hier ein Beispile mit dem du es testen kannst. Prozedur 1 erzeugt 400 Einträge mit Daten und Texten, Prozedur 2 sortiert sie:

Delphi-Quellcode:
//Zufallsdaten generieren
procedure TForm1.Button1Click(Sender: TObject);

  function ZufallsDatum: TDateTime;
  begin
    Result := EncodeDateTime(Random(109) + 1900, Random(12) + 1, Random(28) + 1,
      Random(23) + 1, Random(59) + 1, Random(59) + 1, Random(100) + 1);
  end;

const
  x = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed di';
var
  i: Integer;
  DT: TDateTime;
  ZT: String;
begin
  for i := 0 to 400 - 1 do
  begin
    DT := ZufallsDatum;
    ZT := Copy(x, Random(40) + 1, Random(20) + 4); //ZufallsText
    LBItemHinzufuegen(ListBox1, DT, DateTimeToStr(DT) + ' ' + ZT);

    //hier eine etwas verschärfte Version
    //LBItemHinzufuegen(ListBox1, DT, ZT + ' ' + DateTimeToStr(DT));
  end;
end;

//Alles sortieren
procedure TForm1.Button2Click(Sender: TObject);
begin
  LBSortieren(ListBox1);
end;
Angehängte Dateien
Dateityp: zip pak_107.zip (3,4 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#29

Re: Listbox nach Datum sortieren

  Alt 28. Jun 2009, 15:01
Und wieso wird Heikos Vorschlag mit CustomSort ignoriert? Das ist doch genau für solche Fälle vorgesehen und verwendet intern einen Quicksort.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#30

Re: Listbox nach Datum sortieren

  Alt 28. Jun 2009, 15:22
Ich danke euch. Nein nein, ich ignoriere nichts. Ich nehme alle Vorschläge dankend an.

Habe nur gerade die wahnwitzige Idee, ein kleines Proggi mit mehreren Listboxen zu machen, die gleichzeitig die Daten mit verschiedenen Routinen sortiert. Ich hatte vor Tagen nur begonnen, die Quicksort-Routine ins Programm zu schreiben und zu verändern. Deshalb wollte ich diese erst vollenden.

Popov, die Listbox soll ja nach Datums sortiert werden. Einmal absteigend nach Jahren und ein andermal nach Monaten, wobei im letzteren Fall die Jahre keine Rolle spielen.

Die 'ShellSort' von Starstruck habe ich schon drin.
Die 'CustomSort'(Link von hoika), hab ich mir schon angeschaut und gefällt mir von allen bisher am besten.

Was mir fehlt ist mehr Zeit zu haben. Ich möchte ja nicht nur abschreiben, sondern auch was lernen.

  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


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 04:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz