Autor |
Beitrag |
cody
Hält's aus hier
Beiträge: 11
|
Verfasst: Sa 15.07.06 22:14
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
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: 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
      
Beiträge: 39
|
Verfasst: 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 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
cody 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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
      
Beiträge: 39
|
Verfasst: 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...
Zuletzt bearbeitet von Peinhard am Di 18.07.06 10:57, insgesamt 1-mal bearbeitet
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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ß
|
|