Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - sortieren in der Listbox
cody - Sa 15.07.06 22:14
Titel: sortieren in der Listbox
Hallo Delphi-Gemeinde,
habe mal wieder eine Frage!
Wie kann ich in einer ListBox nach Datum sortieren?
Ich habe in jeder Zeile am Anfang ein Datum mit Uhrzeit, jetzt wollte ich die Zeilen
nach dem Datum sortieren. Wenn ich mit der funktion sorted mache wird zwar sortiert
aber nicht nach Datum sondern nach Zahlen.
Kann mir bitte da einer weiter Helfen!!!
Gruß
Moderiert von
jasocul: Topic aus Dateizugriff verschoben am Di 18.07.2006 um 09:05
Blackheart666 - Sa 15.07.06 22:30
Sowie das Datum mit führenden Null ausgegeben wird müsste es doch ohne weiteres klappen.
01.10.2006
11.10.2006
Peinhard - Sa 15.07.06 22:57
Nur wenn das Datum in der Form YMD mit führenden Nullen vorläge, könnte man einen Alphasort einsetzen. Für diesen Zweck hier würde ich wohl eine TStringList erstellen, die Items mit Assign 'überstellen' und die Methode CustomSort mit eigener Funktion verwenden, dazu zum Vergleichen das Datum vom Stringformat wieder in TDateTime zurückverwandeln. Nach der Sortierung wieder zurück an die Listbox.
cody - Di 18.07.06 00:57
Hi Blackheart666 & Peinhard,
habe es mal so versucht... aber das funktioniert so nicht!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button1Click(Sender: TObject); var MyList: TStringList; begin MyList := TStringList.Create; MyList.Add(Memo1.Text); MyList.Sorted := True; ListBox1.Items.AddStrings(MyList); MyList.Free; end; |
Benutze ich Buchstaben geht es mit Zahlen auch, aber mit einen Datum
geht es nicht.
Bekomme so ein Ergebnis:
01.08.2006
04.06.2006
08.06.2006
09.08.2006
Bitte um H I L F E !
Moderiert von
jasocul: Delphi-Tags hinzugefügt
Keldorn - Di 18.07.06 08:11
Hallo
Peinhard hat dir doch genau beschreiben, was zu tun ist. Nur hast du nur die Hälfte davon umgesetzt und wunderst dich jetzt, warum es nicht funktioniert.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.Button1Click(Sender: TObject); Var MyList: TStringList;
function Compare(List: TStringList; Index1, Index2: Integer): Integer; Var Datum1,Datum2:Tdate; begin datum1:=StrToDate(list[index1]); datum2:=StrToDate(list[index2]); result:=round(Datum1-datum2); end;
begin MyList := TStringList.Create; try MyList.assign(Memo1.lines); mylist.CustomSort(@compare); ListBox1.Items.Assign(MyList); finally MyList.Free; end; end; |
Problem ist hierbei, daß du sicherstellen mußt, daß im Memo auch wirklich ein Datum steht. und das ständige Strtodate ist sehr zeitintensiv. Eine Alternative wäre, wenn du eine Listbox verwendest: ein Objekt im item hinterlegen, dort speicherst du den richtigen Tdate wert und vergleichst beim sortieren diesen, damit sparst du dir das ständige umwandeln.
Mfg Frank
cody - Di 18.07.06 10:31
Hi Keldorn,
Danke schön für deine Antwort.
@ Peinhard hat dir doch genau beschreiben, was zu tun ist. Nur hast du nur die Hälfte davon umgesetzt und wunderst dich jetzt, warum es nicht funktioniert.
Wusste nicht genau was ich machen sollte, bin halt noch Anfänger.
Jetzt aber zu deinen Code. Habe ihn eingesetzt, aber ich bekomme immer eine Fehlermeldung
das es kein gültiges Datum ist.
Habe den Fehler auch schon gefunden, aber stehe wieder vorm großen Berg voller ????????
Fehler ist weil ich in der Zeile am Anfang das Datum stehen habe und dann einen Text.
Also ich fange einfach noch mal von vorne an.
Ich suche in einen Verzeichnis alle Textdateien nach einen Suchwort ab und lasse sie
dann in einen Memo anzeigen. Das funktioniert auch alles nun wollte ich es so haben
das es nach dem Datum sortiert wird. Also habe ich zuerst das Datum anzeigen lassen und
dann den Pfad wo es sich befindet.
Ich weiß nicht wie ich da vorgehen soll.
Um Antwort würde ich sehr freuen und vielleich um etwas code...
Gruß
Peinhard - Di 18.07.06 10:51
Moin,
du mußt also erstmal dein Datum aus der Zeile 'isolieren'.
Wenn das Datum immer gleich am Anfang der Zeile steht und in der Form 'dd.mm.yyyy' vorliegt, also mit führenden Nullen und somit immer 10 Zeichen umfassend, dann sähe das zB so aus:
Delphi-Quelltext
1:
| datum1:=StrToDate(Copy(list[index1],1,10)); |
(Kopier mir beginnend mit dem ersten Zeichen die nächsten 10 und verwandle die dann in ein TDate) - für Datum2 entsprechend. Wenn das Datum in anderer Form vorliegt mußt du evt noch Pos() zu Hilfe nehmen, zB um ein Leerzeichen oder einen anderen Trenner nach dem Datum zu 'finden'. Sieh dir in der OLH mal die Funktion Copy() an und klick da auch mal auf den Eintrag unter 'Kategorie' - da sind die ganzen Prozeduren und Funktionen versammelt, die man für die Verarbeitung von Strings so braucht. Was man wie einsetzt hängt natürlich immer von dem 'Muster' ab, in dem die jeweiligen Strings vorliegen, die man bearbeiten will. Dieses Projekt hier ist vielleicht eine gute Gelegenheit, mal damit ein wenig rumzuspielen und Alternativen auszuprobieren...
jasocul - Di 18.07.06 10:55
Ist doch kein Problem. Du musst nur den Teilstring kopieren:
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:
| procedure TForm1.Button1Click(Sender: TObject); Var MyList: TStringList;
function Compare(List: TStringList; Index1, Index2: Integer): Integer; Var Datum1,Datum2:Tdate; begin try datum1:=StrToDate(copy(list[index1], 1, Pos(' ', list[index1])-1)); datum2:=StrToDate(copy(list[index2], 1, Pos(' ', list[index2])-1)); result:=round(Datum1-datum2); except result := 0; end; end;
begin MyList := TStringList.Create; try MyList.assign(Memo1.lines); mylist.CustomSort(@compare); ListBox1.Items.Assign(MyList); finally MyList.Free; end; end; |
Ich hoffe, dass ich mich mit den Klammern nicht versehen habe und die Syntax richtig ist. Habs eben aus dem Kopf eingetippt. Das Try..Except habe ich zur Sicherheit eingebaut, falls es ungültige Werte geben sollte. Meine Änderung setzt allerdings voraus, dass nach dem Datum immer ein Leerzeichen folgt. Da du geschrieben hast, dass immer Datum und Zeit dort stehen, sollte das eigentlich passen. Ist zwar ein bisschen Quick&Dirty, aber das Feintuning kannst du ja mal versuchen.
cody - Mi 19.07.06 00:13
Hi Peinhard & jasocul,
Danke schön für eure Hilfe.
@ jasocul habe mir deine HP mal angeguckt und zu meinen Favoriten hinzugefügt.
Die wird mir doch noch sehr Hilfreich sein.
Gruß
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!