ListBox -> Datum sortieren -> klappt nicht :...-(
-
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
-
Hi, versuch es doch mal so:
Mal angenommen in Str1 steht Jul.12 12:33
AnsiString MonNbr[12]={"01","02","03","04","05","06","07","08","09","10","11","12"}; AnsiString MonName[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; int pos,z; z=0; do { pos=Str1.Pos(MonName[z]); if (pos==0) z++; } while (pos==0); if (pos>0) { Str1.Delete(pos,3); Str1.Insert(MonNbr[z],pos); }
Das ganze in eine Funktion packen und den neuen AnsiString zurueckliefern.
Gruss Daniel666
-
std::map ist da die reichliche elegantere Lösung...
-junix
-
Danke Daniel, diese Lösung ist auf jeden fall eleganter als die Lösungen die ich hatte (mit if......usw)
naja, @junix vielleicht liegt es daran das ich version 1 des builders habe, aber std finde ich leider nicht in der hilfe, auch nicht map oder sonst was, ich kann suchen wie ich will
-
...kann ja sein, ich wollte ja nur einen zweiten Lösungsvorschlag machen, der zwar nicht so elegant, dafür aber einfacher zu verstehen ist.
P.S.
Die Abbruchbedingung der Schleife sollte im übrigen besserwhile (pos==0 && z<12)
lauten.
Gruss Daniel666
-
@BJ du sollst nicht std sondern map finden...
-junix
-
das einzige was ich finde sind:
Map-Dateien
und damit kann ich doch nichts anfangen oder?
-
Hast du unter Start->Borland C++ Builder->Help einen Eintrag "Standard C++ Library Help" oder so? Da ist das zu finden. Oder tippe mal map in den Editor und drücke F1. Und lies dir vielleicht noch den Hilfe zur Hilfe-Guide durch.
-junix
-
ich habe unter start->borland...->help gar nix, weil es das nicht gibt...
aber danke dir, trotzdem, ich verwende jetzt einfach die "unfeinere" version, hauptsache es funzt.
brauche übrigens dringens hilfe bei diesem problem (worauf leider niemand antowrtet...:-(
http://www.c-plusplus.net/forum/viewtopic.php?t=47880
thx
Bj
-
Hast du schon mal überlegt es einfach mit einer einer Define-Anweisung zu machen, dann würdest du fast keinen Code benötigen.
#define Jan 1 #define Feb 2 . . . . . usw.
FGGF
-
Sehen wir mal davon ab, dass #define eigentlich eher nichtmehr zu verwenden ist wegen der fehldenden Typerisierung, so würde ich mich trotzdem dafür interessieren, wie du jetzt aus einem String den passenden define-Wert rauskriegst?
Ich poste ja manchmal auch unausgegorene Ideen, aber unausgegorene Ideen die ich poste, haben mindestens einen Ansatz dafür, wie man das Problem des Fragestellers lösen könnte...
-junix