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önnteVielen 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.deich 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.