ListBox -> Datum sortieren -> klappt nicht :...-(
-
Hallöchen
Also, ich habe wie gesagt ein Problem mit dem sortieren einer Listbox nach dem Datum!
Hier erstmal der Code:[cpp]
void __fastcall TFormKontrollbogen::popu_sort_datumClick(TObject *Sender)
{
if (lstArchives -> Items -> Count != 0)
{
int Index1 = 0;
int Index2 = 0;if(lstArchives->Items->Count > 1)
{
do{
Index2 = Index1+1;
do{ //der Vergleich
// Schneidet das Datum aus und vergleicht es
if(lstArchives->Items->Strings[Index1].SubString(lstArchives
->Items->Strings[Index1].Pos(" ")+5,15) >
lstArchives->Items->Strings[Index2].SubString(lstArchives
->Items->Strings[Index2].Pos(" ")+5,15))
{
lstArchives->Items->Exchange(Index1,Index2);
Index1 = 0;
Index2 = Index1 + 1;
}
else
Index2++;
}while(Index2 < lstArchives->Items->Count-1);
Index1++;
}while(Index1 < lstArchives->Items->Count-2);
}
}
else memoStatus -> Lines -> Add ("Keine Dateien gefunden");
}
[/cpp]Es ist glaube ich jetzt nicht ganz unkompliziert dadurch zu blicken, aber es wird hoffentlich gehen
Das Ausschneiden des Datums klappt auch, bei jedem Dateinamen!!!
Es hat dann diese Form:
Jul.23 12:45
Doch irgendwie funzt das ganze nicht, denn nachher stehen 3 August-Daten am Ende, was nicht stimmen kann.Woran kann denn das liegen?
was ist denn falsch an der schleife?
also wie gesagt, es kann nicht sein, das er ein Datum falsch ausschneidet, dass habe ich schon kontrolliert...
Ich bin da ziemlich ratlos!
BITTE UM HILFE *fleehhh*thx
Bj
-
Hast du schon mal zur Laufzeit überprüft, ob die Ergenisse des Vergleiches jeweils deinen Erwartungen entsprechen?
-
ja ja, das meinte ich ja damit das die daten die richtigen werte enthalten!
habe das alles schon zur laufzeit überprüft.
es steht auch bei den august daten jeweils immer wunderbar
Aug.21 drin.
das ist alels richtig.
trotzdem ordnet er die nicht richtig ein.ist etwas an der schleife falsch?
wo dran kann das denn noch liegen?thx
Bj
-
also, im grunde steht dann (durch das auschneiden von dem datum mit substring), im vergleich (zum beispiel:)
if (Jul.12 < Aug.26)
erkennt er jetzt nicht, dass Aug größer ist als Jul ???
ich meine also, ob er nicht erkennt ob es daten sind....
.... ich bin hier wie gesagt ziemlich ratlos.das merwürdige ist halt auch, das ein August datum ja am ende steht, die anderen 4 stehen mittendrin, wo sie nicht hingehören.
KANN MIR JEMAND HELFEN?
-
also, ich habe jetzt mal die stelle gesucht, an der der compiler irgendwie macht, was er will.
in der schleife kommt es zu diesem vergleich:if ("Aug.27 15:23" > "Jul.11 09:23") lstbox->Items->Exchange(bla,bla);
Aber er erkennt einfach nicht das das erste datum größer ist!
Warum denn nicht?
Es kommt also NICHT zu dem notwendigen Tausch!
ich verstehe das wirklich nichtbitte um hilfe!!!
-
Bj schrieb:
[b]Aber er erkennt einfach nicht das das erste datum größer ist!
Warum denn nicht?¨Äh ist doch eigentlich logisch? Du sagst ihm, er soll zwei Strings vergleichen, und das macht er brav. Woher soll er denn wissen, dass die Strings ein Datum enthalten, das es zu vergleichen gäbe?!?
-junix
-
da hast du ja recht.
dachte er würde Jul und Aug irgendwie automatisch als datum erkennen, wenn es in der form Aug.21 oder so steht.naja, und was soll ich jetzt tun?
wie bekommt man das jetzt hin?
wie gesagt, ich habe die museumsversion 1 des builderthx
Bj
-
TDateTime ist dir ein Begriff? Vielleicht lässt sich damit was bewerkstelligen. Oder such mal in der VCL-Doku nach StrToTime oder so... Und ansonsten: String parsen (z.B. mit sscanf)...
-junix
-
also TDateTime habe ich in der Hilfe schon gefunden, aber ich bin nicht gerade ein profi im builder, und somit kann ich damit wirklich wenig anfangen...
und was bedeutet String "parsen"?? was ist sscanf?
also, ich hätte jetzt, mit meinem wissen, die Werte Aug oder Jul ausgeschnitten, anhand eines case in zahlen umgewandelt, wieder hinzugefügt und wieder verglichen, da es dann ja klappen müsste!
dies ist natürlich eine ziemlich "anfängerhafte" art und weise, aber anders könnte ich es nicht...
... es sei denn, du würdest mir weiter helfen
hoffnungsvollschau**
-
nochmalhoffnungvollschau**
also ich habe jetzt eine if schleife gemacht:
if (monat == "Jan") monat = 1; else (if monat == "Feb") monat = 2; else // und so weiter
aber das ist ja etwas sehr umsttändlich.
was ich gerne hätte, wäre, das man diesen String Aug.21 23:44 irgendwie als datum einlesen lassen kann und dann vergleichen kann mit einem anderen String.geht das irgendwie?
HILFE BITTE!
-
Hallo Bj,
ich würde das ganz anders lösen
<ausschweif>
TDateTime ist ja im eigentlich ein double Wert wobei
0 der 30.12.1899 12:00 ist
und
02.09.2003 12:00 währe 37866
die Nachkommastellen sind Stunden, Minuten usw.
</ausschweif>also wie währe es wenn Du deine ListBox mit den Doublewerten fütterst
z.b.ListBox1->Items->Add(FormatFloat("0000000.0000000000",(double)Now()));
die Vornullen sind wegen des sortierens
Sorted der ListBox auf true
und Style auf lbOwnerDrawFixedjetzt im Ereignis OnDrawItem sich um die Darstellung kümmern
z.b. mitvoid __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) { TDateTime td = 0 + (double)StrToFloat(ListBox1->Items->Strings[Index]); ListBox1->Canvas->TextOut(Rect.Left+2, Rect.Top+2, FormatDateTime("mmm. dd hh:mm", td)); }
und nun sind deine Datumsangaben sortiert
mfg
VergissEs
-
das ist lieb gemeint VergissEs
aber ich kann die ListBox nicht einfach mit den daten "füttern".Also ich hoffe ich habe dich richtig verstanden.
( kann sein das du es richtig erklärt hast, dann habe ich es nicht richtig verstanden)Genauer:
In meiner ListBox stehen Dateinamen in dieser Form:
VAP2894892728 Jul.12 12:33SO, also müsste ich das Datum erstmal ausschneiden und dann vergleichen.
das geht aber ja nicht, weil die Strings nicht wirklich verglichen werden können...meine frage ist also, wenn ich das datum jetzt in einem String ausgeschnitten habe, wie gebe ich dem compiler zu verstehen, das er es als datum nehmen soll, und nich als normalen string?
geht das überhaupt?
also irgendwie das ausgeschnittene String-datum in ein richtiges Datum umwandeln und dann mit dem nächsten vergleichen!bitte, falls du es erklärst, in anfängersprache
vielen vielen dank
Bj
-
Sorry nicht gesehen das noch was vor den Datum steht bzw. das es sich
eigentlich um eine Dateinamen handelt.Schau dir mal StrToDate in der Hilfe an
aber um dein "Jul.23 12:45 " in ein brauchbares Datumsformat zu bekommen
wird dir nichts anderes übrig bleiben als es per Hand umzuformatierenmfg
VergissEs
-
Wenn du den Monaten Zahlen zuweisen willst nimm doch lieber ne switch Anweisung. Ist übersichtlicher und einfacher.
Als erstes musst du das Datum hinten abschneiden. Also mit Substring usw., Je nachdem ob alle Dateien das gleiche Format haben.
Dann entweder mit einer switch anweisung den Abkürzungen die Zahlen zuordnen, oder versuchen aus diesem Datumsformat ein anders zu generieren.
Wenn du es mit etwas längeren Switch Anweisung machst brauch dein Compiler nicht zu wissen, das es ein Datum ist sondern er vergleicht nur die Werte.
Bzw. einfach der Reihe nach die Substrings vergleichen.FGGF
-
also ich hatte auch schon an ein switch gedacht...... aber switches nehmen doch nur int-datentypen, gell?
also sehe meines dann so aus:
switch (monate) case "Jan"; monata=1; break; case "Feb"; monate=2; break; //usw...
und das wären ja string und das funzt nicht.
vielleicht meintest du es ja auch anders
aber ich kenne es nur sothx
Bj
-
std::map ist dein freund in diesem Fall..
-junix
-
leider kann ich (als fortgeschriettener anfänger
nichts mit
std::map
anfangenes ist schön das das mein freund ist, doch wie soll ich daraus schlau werden, wie implemetiere ich das denn jetzt mit dem switch in den code?
-
Hast du überhaupt schonmal die Hilfe zum Thema std::map befragt? Dazu brauchst du kein Switch mehr. std::map implementiert ein assoziatives Array. Da kannst du dann als Index Zeichenketten verwenden und erhälst als Wert z.B. ne Zahl.
Deklariert wird das Teil etwa so:
std::map<string, char> MonthStringToNumber_map;Dann musst dus noch befüllen (z.B: an Index Jan den Wert 1, etc.) und schon kannst du über äh ich glaub es war was wie MonthStringToNumber_map["Jan"] auf die einzelnen Zahlen zugreifen...
-junix
-
danke, ok
es hilft zwar oft die hilfe zu befragen,a ber als anfänger finde ich, hat man auch da so seine verständnis probleme
-
Dann schau zuerst in die Hilfe und komm mit den Verständnisproblem ins Forum, dann lernst du
a) mit der Hilfe umzugehen
b) die Terminologie der Hilfe kennen und verstehen-junix