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 nicht

    bitte 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 builder 🙂

    thx
    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 lbOwnerDrawFixed

    jetzt im Ereignis OnDrawItem sich um die Darstellung kümmern
    z.b. mit

    void __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:33

    SO, 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 umzuformatieren

    mfg
    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 so 🙂 😞

    thx
    Bj



  • std::map ist dein freund in diesem Fall..

    -junix



  • leider kann ich (als fortgeschriettener anfänger 🙂 nichts mit
    std::map
    anfangen 😉

    es 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


Anmelden zum Antworten