Daten in einem StringGrid sortieren



  • Hallo, ich hoffe, dass mir jemand helfen kann!
    Ich hab folgendes Problem:
    Ich will die Einträge im StringGrid numerisch sortieren (also die kleinst zugehörige Zahl nach ganz unten in die letzte Zeile und die größte halt in die erste Zeile)
    Ich hab aber noch wenig Erfahrung mit der Komponente "StringGrid"
    und wär demjenigen sehr dankbar der mir dass verständlich erklären könnte

    Vielen Dank schonmal im Voraus

    MFG



  • Siehe FAQ.



  • ich finde die Hilfe ja ganz hilfreich - doch bei mir kommt bei der Benutzung von BubbleSortColumn ein Fehler!!

    [C++ Fehler] Unit1.cpp(19): E2316 '_fastcall TForm1::BubbleSortColumn(TStringGrid *,int,bool)' ist kein Element von 'TForm1'

    was heißt das?
    die komponente muss den befehl doch beinhalten oder nicht? oder muss ich da was ändern oder hinzufügen?

    MFG Pedros



  • du musst die funktionen natürlich noch im header der form definieren!

    private:
    
        void __fastcall BubbleSortColumn(TStringGrid *grid, int Column, bool Desc);
        void __fastcall QuickSortColumn(TStringGrid *grid, int Column, int links, int rechts, bool Desc);
    


  • wenn ich jetzt BubbleSort benutze, in welcher Spalte werden dann die Reihen nach Int-Werten sortiert?

    und wo ändert man das?

    MFG Pedros



  • und wie rufe ich die Funktion auf? Ist ja nicht so, dass man das in einen Button reinschreiben kann und dann aufruft.



  • ihr stellt euch aber auch immer an!

    im header des formulares

    private:	// Anwender-Deklarationen
    
       int clicked;
    

    in deinem formular

    //---------------------------------------------------------------------------
    // StringGrid selber zeichnen
    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
    {
      TStringGrid *StringGrid = static_cast <TStringGrid*> (Sender);
    
      // bedingung prüfen und wenn gültig programm beenden
      assert(StringGrid != NULL);
    
      TCanvas* SGCanvas = StringGrid->Canvas;
      SGCanvas->Font    = StringGrid->Font;
    
      RECT RText = static_cast <RECT> (Rect);
      const AnsiString text(StringGrid->Cells[ACol][ARow]);
    
      // fixes zellen malen
      if (State.Contains(gdFixed))
      {
        SGCanvas->Brush->Color = clBtnFace;
        SGCanvas->Font->Color  = clWindowText;
        SGCanvas->FillRect(Rect);
    
        // geklickte zelle so zeichnen, als wäre sie wie ein button gedrückt
        if (ACol == clicked)
          Frame3D(SGCanvas, Rect, clBtnShadow, clBtnShadow, 1);
        else
          Frame3D(SGCanvas, Rect, clBtnHighlight, clBtnShadow, 1);
      }
      else
      {
        // markierte zellen malen
        if (State.Contains(gdSelected))
        {
          SGCanvas->Brush->Color = clHighlight;
          SGCanvas->Font->Color  = clHighlightText;
        }
    
        // alle anderen zellen
        else
        {
          SGCanvas->Brush->Color = StringGrid->Color;
          SGCanvas->Font->Color  = StringGrid->Font->Color;
        }
      }
    
      // zeichenfläche löschen
      SGCanvas->FillRect(Rect);
    
      // text nicht ganz an den rand klatschen
      RText.left += 2;
    
      // zelle zeichnen
      DrawText(SGCanvas->Handle, text.Trim().c_str(), text.Trim().Length(), &RText, DT_SINGLELINE | DT_VCENTER);
    }
    
    void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      int Row, Col;
    
      // Mouseklick auswerten
      StringGrid1->MouseToCell(X, Y, Col, Row);
    
      if ((Row != 0) || !Shift.Contains(ssLeft)) return;
    
      Spalte merken
      clicked = Col;
      StringGrid1->Invalidate();
    }
    
    void __fastcall TForm1::StringGrid1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      int Row, Col;
    
      // Mouseklick auswerten
      StringGrid1->MouseToCell(X, Y, Col, Row);
    
      if (Row != 0) return;
    
      Col     = clicked;
      clicked = -1;
    
      StringGrid1->Invalidate();
    
      // aktualisierung verhindern
      for (int i = 0; i < StringGrid1->ColCount; i++)
        StringGrid1->Cols[i]->BeginUpdate();
    
      // Sortieren der Spalte 'Col'
      QuickSortColumn(StringGrid1, Col, StringGrid1->FixedRows, StringGrid1->RowCount - 1, CheckBox1->Checked);
    
      // aktualisierung wieder herstellen
      for (int i = 0; i < StringGrid1->ColCount; i++)
        StringGrid1->Cols[i]->EndUpdate();
    }
    


  • kannst du mir mal ein vollständiges Beispielprogramm (mit einer Sortierfunktion abwärts) schicken?

    auf:
    paddyformula1@web.de

    ich wäre dir dafür sehr dankbar



  • das programm steht doch oben!

    einfach die entsprechenden ereignis-funktionen mit dem code fuellen. CheckBox1 gibt die sortierrichtung an!

    Ein Beispielprogramm gibt hier zu downloaden. Sortierung funktioniert hier nur in den Spalten mit Zahlen.


Anmelden zum Antworten