StringGrid nach Datum
-
Hallo,
ich möchte mein StringGrid nach der Spalte Datum sortieren. Bis jetzt habe ich es so versucht:
-Das Datum in einen Int umwandeln und in einem Array speichern
-Danach lass ich einen Quicksort über das Array laufenNaja, ihr merkt bestimmt wo der Haken ist. Sobald das Array sortiert ist fehlt der bezug zum StringGrid. Also in welcher Zeile das jeweilige Datum stand. Ich möchte aber nicht so gerne im StringGrid sortieren bzw direkt da rein schreiben weil das etwas länger dauern könnte? Oder?
Bin ich so total auf dem Holzweg?
-
hi,
hier mal ein beispiel zum sortieren in einem stringgrid. werte im beispiel beziehen sich auf Integer.
void __fastcall TForm1::QuickSortColumn(TStringGrid *grid, int Column, int links, int rechts, bool Desc) { // rechte und linke grenze festlegen int i = links; int j = rechts; // den mittelwert bestimmen (sortierung aufteilen) int m = StrToInt(grid->Cells[Column][(int) ((links + rechts) / 2)]); do { // sortier-reihenfolge festlegen while (Desc ? (StrToInt(grid->Cells[Column][i]) < m) : (StrToInt(grid->Cells[Column][i]) > m)) i++; while (Desc ? (m < StrToInt(grid->Cells[Column][j])) : (m > StrToInt(grid->Cells[Column][j]))) j--; if (i <= j) { // zeilen tauschen AnsiString tmp = grid->Rows[i]->CommaText; grid->Rows[i]->CommaText = grid->Rows[j]->CommaText; grid->Rows[j]->CommaText = tmp; i++; j--; } } while (i < j); // rekursiver aufruf if (links < j) QuickSortColumn(grid, Column, links, j, Desc); if (i < rechts) QuickSortColumn(grid, Column, i, rechts, Desc); } // aufruf-beispiel (alle zeilen ab der ersten nicht fixen zeile) // stringgrid, spalte die zu sortieren ist, linke grenze, rechte grenze, aufsteigend oder absteigend QuickSortColumn(StringGrid1, Col, StringGrid1->FixedRows, StringGrid1->RowCount - 1, true);
-
Danke erstmal aber ich habe noch eine Frage. Wenn ich das richtig verstehe wird direkt im sichtbaren StringGrid getauscht bzw sortiert, oder? Ich habe nämlich bis zu 3000 Zeilen und frage mich ob das dann nicht zu lange dauern würde.
-
sortieralgorithmen für stringgrid findest du auch in den FAQ...
vor dem aufruf von quicksort:
// aktualisierung ausschalten for (int i = 0; i < StringGrid1->ColCount; i++) StringGrid1->Cols[i]->BeginUpdate();
danach:
// aktualisierung wieder anschalten for (int i = 0; i < StringGrid1->ColCount; i++) StringGrid1->Cols[i]->EndUpdate();
daten:
bubblesort (3000 integer elemente): ca. 418 Sekunden
quicksort (3000 integer elemente) : ca. 1,8 Sekunden