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



  • 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



  • leider ist es nicht so.
    in Filegetdate steht ein anderes datum drin 😞

    aber trotzdem danke für die überlegung 🙂

    thx
    Bj



  • Was noch eine Überlegung wert ist: Ist das Zeitformat im Dateinamen ein von Betriebssystem generierter Zeitstempel ?? Also ich meine ist es möglich so ein Zeitformat bei den Systemeinstellungen vorzunehmen ??
    Wenn dies der Fall ist kann das Datumsformat relativ einfach umgestellt werden.
    Wenn das nicht der Fall ist, würde ich es ebenfalls mit der if-Schleife machen.

    Die genialste Lösung ist nicht immer die einfachste!!!

    FGGF



  • mhh, also das programm ist nicht von mir und mitunter ziemlich komplex.
    ich musste nur ein paar weitere funktionen einbauen.

    ob das datum von dem system generiert wird, weiß ich nicht.
    aber ich belasse es jetzt einfach bei der if schleife.
    denn glaube ich würde es auch nicht heraus finden ob das datum von system generiert wird....

    velen dank für deine (eure) hilfe
    Bj


Anmelden zum Antworten