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 laufen

    Naja, 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


Anmelden zum Antworten