StringGrid - Zeilen und Spalten löschen/einfügen
-
Gibt es eine Methode um aus einer StringGrid eine Beliebige Zeile zu löschen (BCB 1.0). In meiner Hilfe steht nichts dazu.
[ Dieser Beitrag wurde am 31.10.2002 um 22:06 Uhr von Jansen editiert. ]
-
ne methode gibts da nicht, dass musst du von hand machen...
alle zeilen nach der zu löschende um jeweil eine zeile nach oben verschieben und die letzte zeile leeren, bzw. rowcount-- machen.
-
Es geht genauso, wie Sunday es beschrieben hat.Hier ein mögliches
Beispiel dazu:void __fastcall TForm1::Button2Click(TObject *Sender) { // Zeile löschen int Wahl; int Zeile, Spalte; Wahl = Application->MessageBox("Wirklich löschen?","Zeile löschen", MB_YESNO+MB_ICONQUESTION ); if (Wahl == IDYES) {// Zeile soll gelöscht werden Zeile = StringGrid1->Row; while (Zeile < (StringGrid1->RowCount - 1) ) {// für jede Zeile unterhalb der aktuellen Zeile (außer letze Zeile) // (Zeile+1) nach (Zeile) kopieren // Zelle für Zelle kopieren Spalte = 0; // 1. Spalte hat die Nummer 0!!! while (Spalte < StringGrid1->ColCount) { // Innerhalb einer Zeile alle Spalten von der folgenden Zeile // einzeln kopieren StringGrid1->Cells[Spalte][Zeile] = StringGrid1->Cells[Spalte][Zeile+1]; Spalte++; // Spaltenzähler erhöhen } Zeile++; // Zeile erhöhen } if (StringGrid1->RowCount > 2) StringGrid1->RowCount--; // Zeilenzahl erniedrigen }// Zeile soll gelöscht werden }
Hoffe das hilft dir ein bissel.
Cu.......Edit:
Den Code bitte zwischen die Code-Tags setzen![ Dieser Beitrag wurde am 03.05.2002 um 16:45 Uhr von Jansen editiert. ]
-
Läuft einwandfrei. Danke
-
Sorry, bin neu hier (aber total begeistert von diesem Forum) und das war mein erster Beitrag.
Aber danke für den Tip.Ich werde es beherzigen.Cu...........
-
No problemo.
Beim Zeilenlöschen kann man übrigens dank CommaText auch auf die Manipulation der einzelnen Zellen verzichten.
Um den Thread FAQ-würdig zu machen hier mal ein Ansatz für eine Komplettlösung, d.h Zeilen löschen und einfügen sowie Spalten löschen und einfügen.
Edit 1:
Es lassen sich mehrere Zeilen/Spalten auf einmal löschen/hinzufügen. Gelöscht wird von der selektierten Spalte/Zeile ausgehend nach rechts bzw. unten, eingefügt wird links vor bzw. über der selektierten Spalte/Zeile.Edit 2:
Dank eines Tip von WebFritzi wird jetzt Rows->Assign statt CommaText verwendet.Edit 3:
BeginUpdate/EndUpdate hinzugefügt.//////////////////////////////////////////////////////////////////////////////// // Funktion zum Löschen und Hinzufügen beliebig vieler Zeilen oder Spalten in // einem TStringGrid. Parameter: // TStringGrid *Grid - Zeiger auf das zu bearbeitende Grid // bool Delete - true für Löschen, false für Hinzufügen // bool Cols - true für Spalten, false für Zeilen // int AdjCount - Zahl der zu löschenden/hinzuzufügenden Spalten/Zeilen //////////////////////////////////////////////////////////////////////////////// void AdjustGrid(TStringGrid *Grid, bool Delete, bool Cols, int AdjCount) { if (AdjCount > 0) { Grid->Rows->BeginUpdate(); if (Cols) /////////// Spalten bearbeiten /////////////////////////////////// { TStringList *list = new TStringList(); // Zwischenspeicher für Zeilen/Spalten if (Delete) //***** Spalte soll gelöscht werden ************************// { // wenn selektierte Spalte plus "Zahl zu löschender Spalten" grösser/ // gleich Gesamtzahl der Spalten, entsprechend weniger Spalten löschen if (Grid->Col + AdjCount >= Grid->ColCount + 1) AdjCount = Grid->ColCount - Grid->Col; // wenn nur (noch) eine Spalte, dann einfach die Inhalte löschen if (Grid->ColCount <= Grid->FixedCols + 1) for (int y = 0; y < Grid->RowCount; y++) Grid->Cells[Grid->FixedCols][y] = ""; else { // nicht über den Rand links hinauslöschen if (AdjCount > Grid->ColCount - (Grid->FixedCols + 1)) AdjCount = Grid->ColCount - (Grid->FixedCols + 1); // StringList mit den Einträgen der aktuellen Zeile füllen und // darin an der der Spalte entsprechenden Position die nötige // Zahl von Einträgen löschen; dann in die Zeile zurück kopieren for (int x = 0; x < Grid->RowCount; x++) { list->Assign(Grid->Rows[x]); for (int z = 0; z < AdjCount; z++) list->Delete(Grid->Col); Grid->Rows[x]->Assign(list); } // die letzte(n) Spalte(n) entfernen Grid->ColCount -= AdjCount; } } else //************ Spalte soll eingefügt werden ***********************// { Grid->ColCount += AdjCount; // neue Spalte(n) hinzufügen; for (int x = 0; x < Grid->RowCount; x++) // StringList mit den Ein- { // trägen der aktuellen list->Assign(Grid->Rows[x]); // Zeile füllen und darin for (int z = 0; z < AdjCount; z++) // an der der Spalte ent- list->Insert(Grid->Col, ""); // sprechenden Stelle die Grid->Rows[x]->Assign(list); // nötige Anzahl von leeren } // Einträgen hinzufügen, } // dann zurück kopieren delete list; // nicht vergessen! } else //////////////// Zeilen bearbeiten //////////////////////////////////// { if (Delete) //***** Zeile soll gelöscht werden *************************// { // wenn selektierte Zeile plus "Zahl zu löschender Zeilen" grösser/ // gleich Gesamtzahl der Zeilen, entsprechend weniger Zeilen löschen if (Grid->Row + AdjCount >= Grid->RowCount + 1) AdjCount = Grid->RowCount - Grid->Row; if (Grid->RowCount <= Grid->FixedRows + 1) // wenn nur eine Zeile, dann Grid->Rows[Grid->FixedRows]->Clear(); // einfach den Inhalt löschen else { int Zeile = Grid->Row - 1; // Zeileninhalt jeweils mit while (Zeile++ < Grid->RowCount) // dem der nächsten nicht zu Grid->Rows[Zeile] = Grid->Rows[Zeile + AdjCount]; // löschenden Zeile ersetzen; Grid->RowCount -= AdjCount; // letzte Zeile(n) löschen } } else //*********** Zeile soll eingefügt werden ************************// { Grid->RowCount += AdjCount; // neue Zeile(n) anfügen int Zeile = Grid->RowCount; // Zeileninhalt jeweils mit while (Zeile-- > Grid->Row && Zeile - AdjCount > 0)//dem der entsprechenden Grid->Rows[Zeile] = Grid->Rows[Zeile - AdjCount]; // vorhergehenden ersetzen; for (int z = 0; z < AdjCount; z++) // zum Schluss noch die Grid->Rows[Grid->Row + z]->Clear(); // "eingefügte(n)" Zeile(n) } // leeren } Grid->Rows->EndUpdate(); } }
[ Dieser Beitrag wurde am 09.07.2003 um 11:32 Uhr von Jansen editiert. ]
-
Hey, die Idee mit dem CommaText finde ich ja mal voll geil. Kann man dann auf jedes StringGrid anwenden ohne sich um die Anzahl Cols scheren zu müssen. ***top***