ListView Einträge nach Spalten sortieren
-
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 SymbolCompareDate ist doch in der VCL oder muss ich noch was anderes includen?
-
ok hab
int last_colnoch 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