ListBox -> Datum sortieren -> klappt nicht :...-(



  • 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



  • ... @junix ... sehr richtig 🙂



  • Du schneidest den Substring aus dem String ab, also Jan, Feb usw. und vergleichst diese untereinander. Da vorher Jan usw. als Zahl definiert worden sind sollte es nicht allzu schwer sein diese zu sortieren.

    FGGF



  • The Godfather schrieb:

    Du schneidest den Substring aus dem String ab, also Jan, Feb usw. und vergleichst diese untereinander. Da vorher Jan usw. als Zahl definiert worden sind sollte es nicht allzu schwer sein diese zu sortieren.

    Ich bin nicht der stärkste abstrakte denker... um eine Beispielcodierung wär ich dankbar... - hätte nie gedacht, dass ich das jemals schreibe (o;

    Ich seh immernoch nicht, wie du die Verbindung, #define(d-Konstante) nach String schaffst...

    -junix



  • Ich setz mich heute abend mal daheim hin und probiers mal aus. Ich weiss nicht obs geht. Aber ich werd mal sehn was sich machen lässt. Aber die Idee finde ich schon mal gut von mir. 🤡 🤡

    FGGF



  • @ deine idee ist superklasse!
    ich verstehe die zwar noch nicht aber macht nix.

    was macht #define denn eigentlich.
    den text in der hilfe dazu verstehe ich leider nicht.

    bin mal gespannt ob es bei dir geklappt hat, denn denke mal sowas kann man imemrmal wieder brauchen....

    😃

    Bj



  • Morgen,

    @ junix: Sorry, habs gestern nicht mehr geschafft. Bin erst um 23.00 Uhr daheim gwesen. Werd mich nachher mal dransetzen.

    @ Bj:

    #define alpha 1
    #define bravo 2
    

    Eigentlich dient dies oft zur Erleichterung und Vereinfachung von Quellcode.
    Mit einer Define Anweisung teilst du dem Compiler einfach mit, dass an jeder Stelle im Quellcode an der alpha steht eine 1 gesetzt werden soll. Dem Compiler ist es egal ob er mit einer 1 oder mit alpha arbeitet. Aber dem Programmierer ist es so oft leichter den Überblick zu behalten.
    Oder die andere Möglichkeit ist z.B. wenn du einen konstanten Wert im Quellcode hast, dann schreibst du statt der Zahl den DefineAusdruck hin und bei Änderungen musst du nicht durch den Quellcode gehen und suchen, sondern änderst ihn einfach in der Define-Anweisung.

    Junix korrigier mich falls ich falsch liege. 😋

    Ob das mit den Monaten hinhaut weiss ich nicht, könnte eventuell Ärger geben. Sehe da schon wieder so ne lustige Meldung wie Konvertierung von AnsiString nach Integer nicht möglich..... Mal sehn. Hab heute morgen mal Zeit. Werds mal probieren, obs ne Möglichkeit gibt.



  • also, wenn man jetzt zB:

    #define Jan 1
    

    schreiben würde, würde der compiler den "Jan" wert dann auch in Strings als wert 1 nehmen.

    Also zB habe ich dort den String:
    Jan.23 12:33
    würde er, falls es denn dann klappen sollte, aus Jan eine 1 machen?
    oder müsste Jan seperat und ganz alleine in einem string stehen?

    denn wenn es seperat stehen muss, hat diese möglichkeit keinen sinn für mich... 😉 da der rest des datum auch eine große rolle spielt.
    oder ich müsste es ausschneiden, und dann als neue variable monat + den rest wieder anhängen.
    hängt er dann eine 1 an?
    naja, das sind viele fragen 🙂

    aber es interessiert mich sehr ob das geht.

    thx
    Bj



  • Denkfehler: Von den Strings weiss der Präprozessor (der übrigens Define verarbeitet und die Ersetzungen vornimmt) ja nichts. Jan wird also nur durch 1 ersetzt, solange Jan im Quelltext steht. Zur Laufzeit ist das unmöglich vom Präprozessor handlebar.
    #define sollte man in C++-Programmen auch gar nicht mehr verwenden (wegen der fehlenden Typerisierung) sondern "const <typ> <bezeichner>".

    -junix



  • Das liegt das Problem, das ich im Moment noch sehe. Da der Jan in einem String steht. Normalerweise schreibt man den DefineAusdruck wie eine Zahl in einen Aufruf.

    z.B. Flaeche=5*a+b
    
    mit #define Anzahl 5
    
    schreibt man
    
    Flaeche=Anzahl*a*b
    

    Aber mal ne gute Frage: Was passiert wenn ich

    #define Jan 1

    und den String Str="Jan" in einen Integer caste ??

    Rafft der Compiler dies, oder gibts die Fehlermeldung, dass Jan kein gültiger Integerwert ist ??

    FGGF

    Edit1: War ich zu langsam. 😡



  • tja, wenn es zur laufzeit nicht erkannt wird, nützt es doch eigentlich nichts oder?
    denn vergleicht wird doch -immer- nur zur laufzeit?!

    könntest du mal ein beispiel geben für:
    "const <typ> <bezeichner>"

    und was bewirkt das denn dann?

    thx
    Bj



  • The Godfather schrieb:

    Aber mal ne gute Frage: Was passiert wenn ich [...Beschreibung eines wilden gefummeles mit Zeigern, etc...]
    Rafft der Compiler dies, oder gibts die Fehlermeldung, dass Jan kein gültiger Integerwert ist ??

    Das Ergebnis hängt davon ab, wie du den String deklariert hast.
    1. Casten ist böse und sollte vermieden werden
    2. man Castet nicht "einfach mal so" irgendwelche Werte
    3. Man sollte nicht casten, wenn man sich nicht bewusst ist, was dabei genau geschieht.

    Ich empfehle dir mal irgendwo im Netz ein Tutorial zum Thema C, Datentypen, Zeigern und Casten aufzutreiben, dann wirst du merken, was für eine wahnwitzige Idee du da hattest.

    -junix



  • Hmmm... die einzige Möglichkeit, die ich sehe, wäre dein Datum in der Form "JahrMonatTag" zu codieren. Also so etwas wie "20030904". Und dann einer TStringList hinzufügen und mit TStringList::Sort() sortieren. Am besten hängst du dann gleich noch den Ausgangsindex an ("20030904xxx"). Den kannst du dann mit SubString auslesen und dann dein ListBox::Items danach wieder neu aufbauen. Schau dir auch mal "AnsiReplaceStr" in der Hilfe dazu an.

    -Dasd



  • naja, also mit dem austauschen is schon eine idee.
    aber ich habe es ja auf diese unschöne art gemacht. 😡
    if "Jan"
    monat = 1
    if "Feb"
    monat = 2

    dann diese "Jan" im string ersetzten durch die zahl, und schon klappts.

    Sieht zwar mega schei** aus, aber wer sieht den code schon?
    😮

    ich finde, es ist zwar interessant eine neue, schöne lösung zu finden, und da ich hier praktikant bin, habe ich auch genaug zeit dafür, aber wenn ich später mal son problem habe, werd ich bestimmt keine zeit haben mir eine schönere lösung zu überlegen.

    was will ich damit jetzt eigentlich genau sagen?

    nochmal zu #define:
    #define jan 1
    man könnte also überall wo 1 steht, auch jan dafür schreiben.
    also im grunde das selbe wie enum, in diesem beispiel?!



  • TStringList *Monts;
    ...
    Months->CommaText = "Jan,Feb, ...,Dez"};

    int monat = Months->IndexOf("Jan") + 1;



  • Wenn ich mir den Name deiner Dateien so anschaue, fällt mir was auf.
    Ist das Erstellungsdatum der Datei eigentlich gleich der Zeitangabe die im Dateiname steht ??

    FGGF



  • hehe 🙂
    sehr gute anmerkung @ godfahther 🙂

    naja, veilleicht 🙂
    ich weiß es leider nicht, da ich keine ahnung habe wo das erstellungsdatum der datei nachzuscheuen ist.
    aber glaube das ist das erstellungsdatum.
    denn die dateien heißen eigentlich nut:

    VAP2834824.btx
    und dahinter folgt dann das datum.



  • Entweder mit dem Windows-Explorer oder über MS-Dos Eingabeaufforderung.
    Wenn das nämlich so wäre, könnte man sich überlegen ob man nicht nach dem
    Erstellungsdatum sortiert. Den Zeitstempel des Betriebssystem kann man mit FileGetDate auslesen. Und das Datumsformat ist relativ leicht zu bearbeiten und in die gewünschte Form zu bringen. Also schau mal nach ob dem so ist.

    FGGF


Anmelden zum Antworten