ListView Einträge nach Spalten sortieren



  • Ich würde für meine Kundenverwaltung gerne die Einträgi in einer ListView sortieren. Zum Beispiel wenn man auf Vorname klickt, werden die Einträge nach dieser Spalte sortiert, wie man es von Lexware... kennt. Habe schon die Suche benutzt aber nicht geeignetes gefunden AlphaSort sortiert ja anscheinend leider nur nach der Ersten Spalte...



  • Wie man sowas in einem StringGrid macht -> http://www.bytesandmore.de/rad/cpp/snipp/sc02039.php

    Vielleicht findest du aber auf der Seite noch andere nützliche Tipps, ist wirklich zu empfehlen!
    Hoffe dir hilft das weiter.



  • sort_asc und ColumnToSort sind private ints vom Fenster.
    In der Compare-Methode wird so lange vergliche wie die beiden zu vergleichenden Strings gleich sind. Es wird immer die gewählte Spalte zu erst verglichen und dann hin zur ersten Spalte gearbeitet. Das lässt sich noch individuell anpassen, so das z.B. nach der dritte mit der ersten und danach mit der füften Spalte verglichen wird.... Da ist der phantasie keine Grenze gesezt. Sollten die beiden Elemente komplett gleich sein, würde sich das while ja niemals beenden. Darum Zählt das "z" mit und bricht nach 5 durchläufen ab...

    void __fastcall TPatientAuswahlDlg::ListView1Compare(TObject *Sender,
          TListItem *Item1, TListItem *Item2, int Data, int &Compare)
    {
            int originalColumn=ColumnToSort;
            Compare=0;
            int z=0;
            while(Compare==0)
            {
                    //Die beiden zu vergleichenden Strings
                    AnsiString t1 = ColumnToSort>0?Item1->SubItems->Strings[ColumnToSort-1]:Item1->Caption;
                    AnsiString t2 = ColumnToSort>0?Item2->SubItems->Strings[ColumnToSort-1]:Item2->Caption;
                    if(ColumnToSort!=2)
                    {
                            Compare = sort_asc ? AnsiCompareStr(t1, t2) : AnsiCompareStr(t2, t1);
                            if(originalColumn==0 && ColumnToSort==0) ColumnToSort++;
                            if((ColumnToSort==0 && Compare==0) || z>5) break;
                            else ColumnToSort--;
                    }
                    else
                    {
                            //Datum vergleichen
                            Compare = sort_asc ? CompareDate(StrToDate(t1), StrToDate(t2)) : CompareDate(StrToDate(t2), StrToDate(t1));
                            ColumnToSort--;
                    }
                    z++;
            }
            ColumnToSort=originalColumn;        
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TPatientAuswahlDlg::ListView1ColumnClick(TObject *Sender,
          TListColumn *Column)
    {
            ListView1->Items->BeginUpdate();
            ColumnToSort = Column->Index;
    
            // sortierreihenfolge
            sort_asc = ColumnToSort != last_col ? true : !sort_asc;
            last_col = ColumnToSort;
    
            // bitmap des pfeils der neuen spalte zu ordnen
            for (int i = 0; i < ListView1->Columns->Count; i++)
            {
                    ListView1->Columns->Items[i]->ImageIndex = -1;
            }
    
            if (sort_asc)
            {
                    Column->ImageIndex = 0;
            }
            else
            {
                  Column->ImageIndex = 1;
            }
            // alles sortieren (ruft OnCompare auf)
            ((TCustomListView *) Sender)->AlphaSort();
            // aktualisierung beendet
            ListView1->Items->EndUpdate();
    }
    


  • ja kenne die seite ist sehr gut!!! aber ich hab das ganze nicht richtig in mein programm integrieren können...versuche nun mal das andere...



  • habe leider ein paar kleine probs:

    Funktion CompareDate kann er nicht finden (hab doch vcl includet o.O)
    last_col = Undefined Symbol

    CompareDate ist doch in der VCL oder muss ich noch was anderes includen?



  • ok hab

    int last_col
    

    noch gesetzt haste vergessen ^^

    geht einwandfrei und viel besser als das snippet von rad bytes nur nach datum soritert er nicht bzw. die funktion geht nicht... kann er nicht finden 😞 das benötige ich unbedingt!



  • Stimmt. last_col hatte ich vergessen, sorry 😉 aber es spricht für dich das du es gemerkt hat 😉
    Nun üben wir mal den Umgang mit der Hilfe: Frag die Hilfe doch mal nach CompareDate....



  • hmm hab die hilfe mal "gefragt" 😉 aber da steht nur das, was ich sowieso schon weiß.. und zwar das man mit dieser funktion 2 datetimes vergleichen kann... das ist ja ganz schön, dass man das kann... aber er kann die funktion nicht finden 😉



  • Hst Du den Header für die DateUtils 'includiert'?



  • ja eben ich weiß nicht, was ich includen muss, damit die funktion geht....
    dachte das ist schon in der vcl drinne... ja wie heißt denn der header für die DateUtils?



  • in diesem Fall ist's relativ einfach: 😉

    #include <DateUtils.hpp>
    


  • Da du ja scheinbar etwas Probleme mit der Hilfe hast, solltest du dir mal dieses Tutorial von einem unserer Board-Gurus zu Gemüte führen:
    http://www.junix.ch/bcb/help/

    Und ab jetzt immer daran Denken: Erst die BCB-Hilfe....



  • Superding, genau so einen Code habe ich schon seit längerem gefunden. Habe bisher nur eine Delphi Unit benutzt.

    Allerdings dauert das Compilieren mit einer Delphiunit im Projekt jedesmal ewigkeiten.

    Foxy


Anmelden zum Antworten